Для начинающих массивов переменной длины, таких как char_list
int len = text.length();
char char_list[len + 1];
, не является стандартной функцией C ++. Код не будет компилироваться, если использовать компилятор C ++, который не имеет собственного языкового расширения, позволяющего использовать массивы переменной длины.
В этом случае вам следует динамически распределять массив
int len = text.length();
char *char_list = new char[len + 1];
также плохая идея использовать подписанный тип int
для хранения объекта целого типа без знака std::string::size_type
, который в общем случае может быть слишком большим для хранения в объекте типа int
Вы можете просто написать, используя спецификатор auto
auto len = text.length();
char *char_list = new char[len + 1];
Тем не менее, используемая C строковая функция strcpy
копирует символы из исходного массива символов в целевой массив символов до завершающего нулевого символа ' \ 0 'не будет скопировано. То есть символ завершающего нуля '\0'
играет роль дозорного значения, которое хранится в строке вместе с другими символами.
Аналогичным образом ведет себя перегруженный оператор <<
, когда его аргумент имеет тип char *
.
Без резервирования дополнительного байта для завершающего нуля в массиве символов ваша программа имеет неопределенное поведение, хотя и обеспечивает для такой простой программы ожидаемый результат.
Вы можете скопировать исходный объект типа std :: string, исключая завершающий ноль, следующим образом, используя другую строковую функцию strncpy или memcpy
int len = text.length();
char char_list[len];
memcpy(char_list, text.c_str(), len );
Но в этом случае вы не можете использовать оператор <<. Вместо этого вы можете написать </p>
cout.write( char_list, len ) << endl;