Как получить C-строку из строки, содержащей \ 0, не теряя \ 0 - PullRequest
1 голос
/ 22 ноября 2010

У меня в настоящее время довольно большая строка. Мне нужно преобразовать его в C-строку (char *), потому что функция, которую я хочу использовать, принимает только C-строку в параметре.

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

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

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

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

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

Ответы [ 5 ]

8 голосов
/ 22 ноября 2010

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

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

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

2 голосов
/ 22 ноября 2010

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

0 голосов
/ 22 ноября 2010

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

Подойдет ли одна из этих идей?

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

Я немного смущен, но:

string x("abc");
if (x.c_str()[3] == '\0')
{ cout << "there it is" << endl; }
0 голосов
/ 22 ноября 2010

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

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