Что не так с этим назначением строки? - PullRequest
1 голос
/ 30 ноября 2011
string s="abcdefghijklmnopqrstuvwxyz"
char f[]=" " (s.substr(s.length()-10,9)).c_str() " ";

Я хочу получить последние 9 символов s и добавить "" в начало и конец подстроки и сохранить ее как символ [].Я не понимаю, почему это не работает, хотя char f [] = "" "a" "" работает.

Is (s.substr (s.length () - 10,9)).c_str () не строковый литерал?

Ответы [ 3 ]

5 голосов
/ 30 ноября 2011

Нет, это не строковый литерал.Строковые литералы всегда имеют форму "<content>" или расширяются до этого (макросы, например __FILE__).

Просто используйте другой std::string вместо char[].

std::string f = " " + s.substr(s.size()-10, 9) + " ";
3 голосов
/ 30 ноября 2011

Во-первых, подумайте, следует ли вам использовать cstrings. В C ++ обычно используют строку.

Однако, если вы хотите использовать cstrings, конкатенация "abc" "123" -> "abc123" является операцией препроцессора и поэтому не может использоваться с string :: c_str (). Вместо этого самый простой способ - создать новую строку и взять .c_str () этого:

string s="abcdefghijklmnopqrstuvwxyz"
char f[]= (string(" ") + s.substr(s.length()-10,9) + " ").c_str();

(РЕДАКТИРОВАТЬ: Вы знаете, что, на второй взгляд, это действительно плохая идея. Cstring должен быть освобожден после окончания этого оператора, так что использование f может привести к segfault. готов связываться с strcpy и всем этим безобразным. Серьезно.)

Если вы хотите вместо этого использовать строки, рассмотрите что-то вроде следующего:

#include <sstream>
...
string s="abcdefghijklmnopqrstuvwxyz"
stringstream tmp;
tmp << " " << s.substr(s.length()-10,9) << " ";
string f = tmp.str();
1 голос
/ 30 ноября 2011

@ Xeo расскажет вам, как решить вашу проблему.Вот несколько примеров того, как обрабатываются строковые литералы в процессе компиляции.

Из раздела A.12 Предварительная обработка Язык программирования C :

Escape-последовательностив символьных константах и ​​строковых литералах (пар. A.2.5.2, A.2.6) заменяются их эквивалентами;затем смежные строковые литералы объединяются.

За объединение отвечает препроцессор, а не компилятор.(Вы спрашивали ответ C ++. Я ожидаю, что C ++ обрабатывает строковые литералы так же, как C).Препроцессор имеет только ограниченные знания языка C / C ++;(s.substr(s.length()-10,9)).c_str() часть не оценивается на этапе препроцессора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...