PDA

Просмотр полной версии : Вырезать подстроку из строки S с SBEGIN позиции до SEND позиции?


Botirbek Samandarov
17.03.2009, 18:48
Написал вот такой код

#include <iostream.h>
#include <string.h>
char *copystr(char *s, int sbegin, int send);
main()
{
cout <<"Satrni kiriting -> ";
char satr[256];
cin.getline(satr, 256);
cout<<copystr(satr, 5, 3);
}

char *copystr(char *s, int sbegin, int send)
{
int i,j=0;
char *rez = new char[send];
for (i=sbegin-1; i<sbegin+send-1; i++)
{
rez[j]=s[i];
j++;
}
return rez;
}

Где допустил ошибку?

shumbola
17.03.2009, 19:49
Где допустил ошибку?

Ошибка в выборе книжки для изучения С++.

DarkUser
17.03.2009, 20:18
Где допустил ошибку?
это типа загадка, да?!

Dolphin
17.03.2009, 20:38
Судя по инклудам в стиле "<>", копилятор с++. Собственно класс стринга уже подключен. Почему бы не юзать стандартные процедуры для работы со строками? Или нужен код именно в ANSI C?

shumbola
17.03.2009, 20:49
Или нужен код именно в ANSI C?
Код написан ни на ANSI C, ни на ANSI/ISO С++. Скорее всего код написан человеком, который только начал изучение С++ и выбрал себе плохой учебник. ;-)

DarkUser
17.03.2009, 20:59
человеком, который только начал изучение С++
Суровые каракалпакские кодеры сначала преподают С++ в университете, а уже потом его-же изучают...

Botirbek Samandarov
18.03.2009, 10:40
Судя по инклудам в стиле "<>", копилятор с++. Собственно класс стринга уже подключен. Почему бы не юзать стандартные процедуры для работы со строками? Или нужен код именно в ANSI C?

Я не нашел стандартную функцию для вырезки подстроки, наверно и нету (Как в паскале copy(s, sbegin, send) )

Botirbek Samandarov
18.03.2009, 10:57
Всем спасибо
Я просто забыл добавить конец строки

#include <iostream.h>
char *copystr(char *s, int sbegin, int send);
main()
{
cout <<"Satrni kiriting -> ";
char satr[256];
cin.getline(satr, 256);
cout<<copystr(satr, 5, 3);
}

char *copystr(char *s, int sbegin, int send)
{
int i,j=0;
char *rez = new char[send];
for (i=sbegin-1; i<sbegin+send-1; i++)
{
rez[j]=s[i];
j++;
}
rez[j]='\0';
return rez;
}


если ест другие варианты, жду

Dolphin
18.03.2009, 11:21
// string::substr
#include <iostream>
#include <string>
using namespace std;

int main ()
{
string str="We think in generalities, but we live in details.";
// quoting Alfred N. Whitehead
string str2, str3;
size_t pos;

str2 = str.substr (12,12); // "generalities"

pos = str.find("live"); // position of "live" in str
str3 = str.substr (pos); // get from "live" to the end

cout << str2 << ' ' << str3 << endl;

return 0;
}

vcoder
21.04.2009, 09:30
Судя по инклудам в стиле "<>", копилятор с++. Собственно класс стринга уже подключен. Почему бы не юзать стандартные процедуры для работы со строками? Или нужен код именно в ANSI C?

Тимур, Вы подтруниваете над человеком, который только начал изучение С++, однако Ваш код тоже не безупречен.
Все мы когда-то начинали...
Объявление всех переменных в самом начале функции это тоже стиль С, а не С++.

IMHO, так больше на С++ похоже:


// string::substr
#include <iostream>
#include <string>
using namespace std;

int main ()
{
const string str = "We think in generalities, but we live in details.";
// quoting Alfred N. Whitehead

const string str2 = str.substr (12,12); // "generalities"

const size_t pos = str.find("live"); // position of "live" in str
const string str3 = str.substr(pos); // get from "live" to the end

cout << str2 << ' ' << str3 << endl;

return 0;
}

Dolphin
21.04.2009, 12:22
Тимур, Вы подтруниваете над человеком, который только начал изучение С++, однако Ваш код тоже не безупречен.
Это не мой код. Это первый ответ гугла на запрос "c++ substr".
IMHO, так больше на С++ похоже:
А зачем все константами - то?

shumbola
21.04.2009, 19:07
А зачем все константами - то?
А чтоб было. :-)

ИМХО, перебор с const, тем более пример не про const. ;-)

vcoder
22.04.2009, 09:18
А зачем все константами - то?

Чтобы случайно не изменить.
Если не собираешься изменять переменную, то имеет смысл сделать ее константной - меньше вероятность наделать багов.

Кроме того это может помочь компилятору оптимизировать код, например не создавать объекты, а произвести вычисления в процессе компиляции. Правда это вряд-ли осуществимо в приведенном примере.

vcoder
22.04.2009, 09:24
ИМХО, перебор с const, тем более пример не про const. ;-)

Лучше больше, чем меньше.
С непривычки может выглядить дико, но моя практика показыват что такой "фанатичный" подход может съэкономить десяки часов отладки, когда меняется переменная, которая по замыслу меняться не должна.

shumbola
22.04.2009, 19:42
ИМХО, перебор с const, тем более пример не про const. ;-)

Лучше больше, чем меньше.
С непривычки может выглядить дико, но моя практика показыват что такой "фанатичный" подход может съэкономить десяки часов отладки, когда меняется переменная, которая по замыслу меняться не должна.

Во всем должна быть мера. Я выше не зря писал "тем более пример не про const.". const и const-коррекность заслуживает отдельную тему. Если хотите откройте тему и обучайте. ;-)

dovdir
21.05.2009, 13:50
#include <stdio.h>

char *substr(const char *,int,int);

int main(){
char a[]="SalomDunyo";
char *s;
s=substr(a, 6, strlen(a));
printf("%s",s);
return 0;
}

char *substr(const char *suz, int p, int n){
char *pS=suz+p-1;
char *buf = malloc(sizeof(char)*(n-p+2));
int i;
for(i=0;i<=n-p;i++)
*buf++ = *pS++;
*buf ='\0';
return buf-(n-p+1);
}

DarkUser
21.05.2009, 15:37
Код: ...
с добрым утром, блин...