Строка стиля c на вопросе c ++ - PullRequest
0 голосов
/ 02 мая 2011

так что вы можете сделать строку в стиле c на c ++, используя char * ...

мой вопрос, можете ли вы сделать что-нибудь, что вы можете сделать с обычной строкой с таким объявлением ..

так, предположим, у вас есть

char * c;

вы можете сделать:

c = "etcetc";
c = c + "dddddd";

и т. д.?

и, кроме того, в значительной степени это взаимозаменяемо со строкой?

так что

char * c = "etcetc";
string s; 

s = c; 

будет ли это допустимым?

Ответы [ 5 ]

3 голосов
/ 02 мая 2011

Строка в стиле C по сути является символьным массивом с нулевым символом в конце, в то время как std :: string в C ++ является хорошо спроектированным объектно-ориентированным классом / объектом строки. В большинстве случаев они НЕ взаимозаменяемы , и это зависит от того, какую операцию вы выполняете.Вы всегда можете позвонить std::string::c_str(), чтобы получить внутреннюю строку в стиле C.

char * c

// OK because this makes c point to the starting address of "etcetc",
c = "etcetc";

// Compile-time error! You cannot add two pointers anyway because it's meaningless
c = c + "dddddd";

// OK, because string has constructor "string ( const char * s )"
string s1 = c;

string s2;
// OK, because string has "string& operator= ( const char* s )"
s2 = c;

Стоит отметить одну вещь:

// "etcetc" is a constant string here and you cannot modify it via pointer c
char * c = "etcetc";

// You can change string contents in two cases
char c[] = "etcetc";
string str = "etcetc";
1 голос
/ 02 мая 2011

Абсолютно нет, нет.

(char *) является строго указателем на область памяти.Конкатенация строк требует нового буфера с копией исходной строки (см. Strcat в ваших документах libC для одного метода).

1 голос
/ 02 мая 2011

Нет, вы не можете объединить char* с помощью +; Вы должны использовать strcat и вручную распределенные буферы. Вот почему класс std::string существует в C ++.

Назначение от char* до string является действительным, поскольку класс string явно поддерживает его.

0 голосов
/ 02 мая 2011

Я недавно перешел на C ++ после нескольких лет работы в Ada и C. Я обнаружил, что никогда не использую строки в стиле C, за исключением преобразования их в строку (и, возможно, обратно, если у меня нет выбора). Сделайте это, и целый ряд общих проблем С исчезнет.

т.е. почему char * x="dadada"; когда string x="dadada"; намного проще позже в коде?

Это допустимый код, который делает именно то, что вы ожидаете, потому что c - это строка, а не символ *.

string c ; 

.......

c = "etcetc";
c = c + "dddddd";
0 голосов
/ 02 мая 2011

char* - указатель на (адрес) a char.Когда вы говорите c = c + "xxx", вы добавляете адрес одной строки в другую.Это почти наверняка не то, что вы хотите.

Вам потребуется использовать строковый класс, который поддерживает конкатенацию, чтобы использовать синтаксис, который вы представляете.В противном случае вы можете вызывать строковые функции старого стиля, такие как strcat().

...