Почему строка 'fname' должна завершаться нулем?

Встретил предупреждение о том, что строка fname должна завершаться нулем. С чем это связано?

void DataInitialization()  //Инициализация данных
{
    FILE* F;
    char fname[100];
    printf("Укажите имя файла, в котором будет хранится база данных (как на примере: text.txt)\n-> ");
    scanf_s("%s", fname, sizeof(fname));
    while (getchar() != '\n');
    if ((F = fopen(fname, "w+")) == NULL)
    {
        printf("Невозможно открыть для чтения файл \n");
        return;
    };
}

Ответы (1 шт):

Автор решения: V-Mor

Любая строка, представленная массивом char или char * (что, по сути, почти одно и то же) должна заканчиваться нулём. Но не символом '0', а нулевым байтом '\0'. То есть символом, КОД которого равен нулю. Такие строки ещё называют нуль-терминированными.

Делается это потому, что строка хранится только в виде указателя на первый символ (того самого fname, который, хоть и объявлен как массив, на деле – от же указатель). Далее идут сколько-то символов подряд в памяти. Сколько именно, функция не знает. Даже если Вы указали размер массива. Следовательно, чтобы ей понять, где же в памяти всё-таки кончается эта строка, начало которой хранится в указателе, и нужен нулевой байт. Как только функция его видит, считает, что строка закончилась.

Сделаем простую проверку, вставим нуль-символ в середину строки и посмотрим, как её выведет программа:

#include <stdio.h>

int main() 
{
  char x[100] = "Hello, \0world!\n";

  printf("%s", x);
}

В результате, как и ожидалось, получим не полную строку, а только ту часть, что стоит до '\0', оставшаяся часть будет обрезана, т.к., как уже упоминалось выше, нуль-символ считается концом строки, а значит всё, что после, не выводится.

Также, думаю, стоит отметить, что, когда Вы присваиваете строковой переменной значение в кавычках, как здесь char x[100] = "Hello, world!\n";, символ '\0' автоматически добавляется в конец такой строки. И если в кавычки вписать ровно 100 символов, оставив размер массива таким же, возможно, случится что-то плохое или программа просто не скомпилится, т.к. не останется места для того самого нуль-символа.

Дополнительная информация здесь.

→ Ссылка