как сказать строке читать 0 и не прерывать работу? - PullRequest
0 голосов
/ 03 августа 2020

У меня есть строка с числами, включая 0. К сожалению, строка распознает число 0 как \ 0 и заканчивает чтение. Есть ли способ интерпретировать 0 как 0 и прочитать его? Моя программа написана на C ++.

char buf[] = { 23, 4, 0, 234, 8}
string test(buf);

В этом случае строка test будет содержать 23 и 4. Но для моего случая она должна содержать 23, 4, 0, 234 и 8.

Эти способы мне не подходят:

string test "abc\0\0def"s;            
string test R"abc\0\0def";

Я пытался сделать string test(buf, 5); как предложенный ниже ответ, но это не сработало:

#include<cstring>
#include<iostream>
#include <string>

using namespace std;

int main()
{
     char buf[]={10, 20, 0, 30, 40};
     string test(buf, 5);
     cout<<test.length()<<endl;
     char final[5]={0,0,0,0,0};

     strncpy(final, test.c_str(),5);
     
     for(int i=0; i<5; i++)
     {cout<<(int)final[u]<<endl;}
}

Ответы [ 2 ]

2 голосов
/ 03 августа 2020

Необходимо указать количество символов:

string test(buf, size(buf));

Для использования std::size здесь требуется #include <iterator>.

Вместо size(buf) вы можете просто написать 5 или получить размер массива другим способом.

0 голосов
/ 03 августа 2020

Используйте типы контейнеров, которые созданы для той функциональности, которую вы хотите использовать. Для чисел, которые вообще не являются символами, вы должны вместо этого использовать std::vector, если вам нужно изменить размер во время выполнения. Если ваши данные постоянны, вы можете вместо этого использовать std::array, что снижает накладные расходы.

Тем не менее, возникает вопрос, почему вы хотите использовать char в качестве типа данных, если у вас есть числа. Почему бы не использовать uint8_t или int8_t?

Вам следует избегать использования strncpy strcpy или даже memcpy, если вас устраивают все доступные типы контейнеров. Почти все контейнеры предлагают прямое копирование / перемещение к цели без вызова каких-либо функций в стиле c.

BTW: final - ключевое слово C ++! Пожалуйста, не используйте его для имен функций, переменных или типов.

int main()
{
     std::vector<uint8_t> test{10, 20, 0, 30, 40};
     std::cout << test.size() << std::endl;
     std::vector<uint8_t> final_ = test; //copy, no special external func required

     // or if you really like to init 0 and overwrite
     std::vector<uint8_t> final2(5); // init with 5 times 0
     final2 = test; // copy;

     // cast is still needed to force cout to print number instead of char
     for ( auto c: final_ ) { std::cout << (uint16_t)c << std::endl; }
}

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