Копировать строковые данные с символом NULL внутри строки в массив char

0

Я пытаюсь скопировать одну строку в массив символов, строка имеет несколько символов NULL. Моя проблема в том, что первый символ NULL обнаружил, что моя программа перестает копировать строку.

Я использовал два подхода. Это то, чем я до сих пор.

#include<iostream>
#include<string.h>
using namespace std;

int main()
{
    std::string str = "Hello World.\0 How are you?\0";
    char resp[2000];
    int i = 0;
    memset(resp, 0, sizeof(resp));
    /* Approach 1*/
    while(i < str.length())
    {
            if(str.at(i) == '\0')
            str.replace(str.begin(), str.begin()+i, " ");
        resp[i] = str.at(i);
        i++;
    }
    /* Approach 2*/
    memcpy(resp, str.c_str(), 2000);
    cout << resp << endl;
    return 0;
}

Эта программа должна печатать Hello World. How are you? Hello World. How are you? , Пожалуйста, помогите мне исправить это.

  • 1
    Если вы печатаете str.length() , это 12 или 24 (ish)? Я думаю, что ваша инициализация неверна. Вам нужно будет вставить 0 в середине вручную.
  • 0
    @MatsPetersson ... Спасибо, мат это только 12.
Показать ещё 2 комментария
Теги:
string
null-character

2 ответа

0
Лучший ответ

Используйте std::copy:

std::copy(str.begin(), str.end(), std::begin(resp));

а затем std::replace:

std::replace(std::begin(resp), std::begin(resp) + str.size(), '\0', ' ');

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

char resp[2000] = {};
  • 0
    stringtoarray.cpp: 23: ошибка: begin' is not a member of std»
  • 0
    @someone Вы должны компилировать с компилятором до C ++ 11. Вместо этого вы можете использовать &resp[0] .
Показать ещё 2 комментария
1

Вы могли бы также снять его с помощью

std::transform(
  str.begin(), str.end(), resp, [](char c) { return c == '\0' ? ' ' : c; }
);

Конечно, поскольку @Mats упомянул, что ваша строка не имеет нулевых символов, строки также могут быть инициализированы следующим образом:

char const cstr[] = "Hello World.\0 How are you?";
std::string str(cstr, sizeof cstr);

С++ 14 имеет оператор std::string literal

std::string str = "Hello World.\0 How are you?"s;
  • 1
    Это также включает завершающий ноль; возможно, sizeof cstr - 1 был задуман

Ещё вопросы

Сообщество Overcoder
Наверх
Меню