Окончание нулевого значения и длина массива символов в c - PullRequest
1 голос
/ 12 июля 2020

Я пишу функцию для проверки длины массива символов в c. Требуется еще один параметр, который устанавливает предел для проверки \0.

int string_length(char* string, int maximum_length) {

    int i = 0;

    while(string[i] != '\0' && i < maximum_length) {
        i++;
    }

    return i;

}

В этом ответе упоминается, что массив символов должен завершаться нулем, если он создан используя синтаксис {}. Я вызываю указанную выше функцию с незавершенным массивом символов, и результат равен 10 (9 букв + 1).

char not_terminated_string[] = {'m', 'y', ' ', 's', 't', 'r', 'i', 'n', 'g' };
int length = string_length(not_terminated_string, 100);
// length is 10

Я не могу понять, почему это так.

Ответы [ 2 ]

3 голосов
/ 12 июля 2020

Для следующей строки компилятор C создает массив элементов размера 10 char и размещает первые 9 символов, добавляя строку \0 разделитель в самый конец.

char *a = "my string";

Учитывая следующую строку; C компилятор создает массив элементов размера 9 char и размещает символы. Разделитель строк в самом конце не добавляется. Если в 10-м байте (байт номер 9) окажется нулевое значение, это будет только случайно.

char b[] = { 'm', 'y', ' ', 's', 't', 'r', 'i', 'n', 'g' };

Оператор « массив символов должен иметь завершение нулем, если он создается с использованием {}"означает, что если вы хотите иметь возможность использовать этот массив символов в качестве строки (например, чтобы иметь возможность использовать его в printf), то вам следует добавить символ завершения строки, себе, вроде;

char b[] = { 'm', 'y', ' ', 's', 't', 'r', 'i', 'n', 'g', '\0' };
1 голос
/ 12 июля 2020

Ваша программа создала десять, потому что вы определили массив только из девяти ненулевых символов, но за ним последовал еще один ненулевой символ, а затем нулевой символ. (Технически поведение вашей программы не определяется стандартом C из-за выхода за пределы массива, и есть другие причины, по которым ваша программа могла затем неправильно себя вести, чтобы произвести десять, но это наиболее вероятный случай.)

Объявление char not_terminated_string[] = {'m', 'y', ' ', 's', 't', 'r', 'i', 'n', 'g' }; определяет not_terminated_string как массив из девяти char, которые инициализируются заданными символами. К этому массиву автоматически не добавляется нулевой символ.

Когда ваша программа передала этот массив в string_length, эта процедура подсчитала девять символов в массиве, а затем попыталась просмотреть десятый. Скорее всего, следующий байт в памяти не был нулевым, поэтому подпрограмма посчитала его и посмотрела на одиннадцатый. Похоже, что один был нулевым, поэтому процедура остановилась и вернула десять.

...