2010-11-21 2 views
1

У меня в настоящее время довольно огромная строка. Мне НЕОБХОДИМО преобразовать его в C-строку (char *), потому что функция, которую я хочу использовать, принимает только C-строку в параметре.Как получить C-строку из строки, содержащей 0, без потери 0

Моя проблема заключается в том, что любая вещь, которую я пробовал, сделала финальную C-строку wayyy меньшей, чем исходная строка, потому что моя строка содержит много \ 0. Тот \ 0 имеют важное значение, так что я не могу просто удалить их (...

Я попробовал различный способ сделать это, но наиболее распространенными были:

myString.c_str(); 
myString.data(); 

К сожалению, C-строка была всегда только содержание исходной строки, которая была перед первой \ 0.

Любая помощь будет принята с благодарностью!

ответ

8

Вы не можете создать C-строку, которая содержит '\0' символы, так как C-строка, по определению последовательность символов, завершенных b y '\0' (также называемая «строка с нулевым завершением»), поэтому первые '\0' в последовательности завершают строку.

Однако существуют интерфейсы, которые принимают указатель на первый символ и длину последовательности символов. Они могут иметь дело с последовательностями символов, включая '\0'.

Остерегайтесь myString.data(), потому что это возвращает указатель на последовательность символов, которая не может быть завершена нулем, в то время как mystring.c_str() всегда возвращает C-строку с нулевым завершением.

+0

О, хорошо ... спасибо за ответ, это оставляет мне еще одну проблему. Я отправлю новый вопрос. – Zwik

+0

@ Zwik: Я как раз собирался опубликовать комментарий с просьбой объяснить, чего вы хотите достичь, вместо того, чтобы просить о средствах для достижения этого. ':)' – sbi

+0

, я отправлю его сегодня вечером, я свяжу его здесь;) – Zwik

0

Хорошо, myString, вероятно, был усечен при строительстве/назначении времени. Вы можете попробовать std::basic_string::assign, который принимает два итератора в качестве аргументов или просто использует std::vector <char>, причем последний является более обычным в вашем прецеденте. И ваш API, использующий эту строку C, должен фактически поддерживать прием указателя символа вместе с длиной.

2

Это невозможно. Нуль - это конец строки с нулевым завершением. Если вы посмотрите на свой буфер символов (используйте &myString[0]), вы увидите, что NULL все еще там. Однако, ни одна из функций C не будет правильно интерпретировать эти значения NULL, потому что NULL не является допустимым значением в середине строки в C.

0

Я немного запутался, но:

string x("abc"); 
if (x.c_str()[3] == '\0') 
{ cout << "there it is" << endl; } 
+0

@Let_Me_Be: Я думаю, что OP относится к случаям, когда у вас будут такие вещи, как '' ab \ 0c \ 0def \ 0г "'. Это прекрасно в 'std :: string', но не в символьном массиве с нулевым завершением. –

+0

@ Билли хорошо, в этом случае он должен либо использовать 'vector ', либо просто' vector ' –

+0

@Let_Me_Be: Почему? 'std :: string' обрабатывает нули только отлично. –

0

Это может не отвечают вашим потребностям, вы сказали: «Эти \ 0 необходимы», но как насчет ускорения или замены символов «\ 0»?

Будет ли одна из этих идей работать?

  1. заменить символы '\ 0' на '\ t' (знак табуляции, десятичный символ 9).
  2. замените '\ 0' на некоторое редко используемое значение char как десятичное число или десятичное значение 255.
  3. Создайте escape-код, скажем, заменив каждый символ '\ 0' на кодированную подстроку (например, восьмеричную, как в "\ 000"). (Обязательно замените любой оригинальный «\» на кодированное значение (например, «\ 134»)).

 Смежные вопросы

  • Нет связанных вопросов^_^