Массивы символов объявляются последовательно перекрывающимися - PullRequest
2 голосов
/ 10 февраля 2020

Я пытаюсь объявить два символьных массива, один за другим. Когда я делаю это, массивы, кажется, накладываются друг на друга.

#include <iostream>

int main(){
    char cmnd[2] = {'l', 's'};
    char flags[1] = {'a'};
    std::cout << "cmnd array: " << cmnd << std::endl;
    std::cout << "flags array: " << flags << std::endl;
}

Выходные данные этого кода становятся следующими:

cmnd array: ls
flags array: als

В соответствии с выводом массив моих флагов, который должен содержать только {'a'}, на самом деле содержит {'a','l','s'}.
Почему это происходит? Заранее благодарим за понимание этого вопроса.

Ответы [ 2 ]

7 голосов
/ 10 февраля 2020

В C ++ все простые char строки действительно называются завершенными нулями байтовыми строками .

Этот нулевой терминатор говорит всем функциям, обрабатывающим такие строки где заканчивается строка Если в строке отсутствует нулевой терминатор, она будет go вне границ, и у вас будет неопределенное поведение .

Если вы хотите иметь массив Символы, используемые в качестве строк, необходимо убедиться, что они содержат нулевой терминатор. В вашем случае это очень просто: не указывайте размер массива и используйте литеральные строки при инициализации:

char cmnd[] = "ls";
char flags[] = "a";

Теперь cmnd будет массивом трех символов, и инициализируется, чтобы содержать 'l', 's' и нулевой терминатор '\0'. Точно так же flags будет массивом из двух символов, инициализированным 'a' и '\0'.

2 голосов
/ 10 февраля 2020

std::cout обрабатывает массивы символов как строки, но ни один из ваших символов не заканчивается на NULL, но cout продолжается до тех пор, пока не найдет символ NULL. Похоже, что ваш массив flags непосредственно предшествует массиву cmnd в памяти, а 0 находится в ячейке памяти сразу после массива cmnd.

Если вы хотите рассматривать их как строки для std::cout, добавить нулевой символ, то есть '\ 0' или просто 0, в конец каждого массива. Если нет, измените способ их передачи на cout.

...