Назначая const char [], нужно ли указывать нулевой термин - PullRequest
0 голосов
/ 16 сентября 2010

Мы устанавливаем char [] для некоторых шестнадцатеричных значений, т.е.

char [] test1 = {0x30,0x31,0x32,0x33,0x34,0x35};

Затем мы копируем его в строку, используя

string teststring(test1, sizeof(test1));

Предполагается ли, что массив завершен нулем? или как мы выполняем задание, C ++ достаточно умен, чтобы знать, что его нулевое значение завершено, и все равно добавляется ли оно?

Ответы [ 3 ]

4 голосов
/ 16 сентября 2010

Поскольку вы используете оператор sizeof и задаете длину массива, вам не нужно добавлять NULL.

Вы можете найти API для конструкторов здесь . Это прямо упоминается.

Однако, как уже упоминалось в других решениях, если вы решили создать массив wchar_t s, вам потребуется изменить предоставленный аргумент длины в конструкторе следующим образом:

sizeof(test1) / sizeof(wchar_t)

Это связано с тем, что оператор sizeof возвращает размер в байтах целевого объекта, а не количество элементов. Для вашего текущего вопроса использование char не имеет этого требования, так как размер char определяется C ++ как 1, поэтому деление не требуется.

2 голосов
/ 16 сентября 2010

Не имеет нулевого значения.Нули не имеют специального значения для std :: string.Вы можете сделать что-то вроде этого свободно:

#include <string>
#include <iomanip>
#include <iostream>
int main()
{
    char test1 [] = {0x30, 0x31, 0, 0x33, 0, 0x35};
    std::string teststring(test1, sizeof(test1));
    for(size_t i = 0; i<teststring.size(); ++i)
        std::cout << std::hex << std::showbase << (int)teststring[i] << ' ';
    std::cout << '\n';
}

Хотя, конечно, если бы я использовал std::string teststring(test1); в качестве конструктора в этом примере, полученная строка имела бы длину 2 символа.

0 голосов
/ 16 сентября 2010

Используя этот конструктор string, вам не нужно добавлять дополнительное окончание 0. Однако я бы добавил окончание 0 на всякий случай или чтобы эта переменная могла использоваться в других контекстах, где используются указатели на символы. В этом случае sizeof следует изменить:

string teststring(test1, sizeof(test1) - 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...