Почему строка '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 шт):
Любая строка, представленная массивом 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 символов, оставив размер массива таким же, возможно, случится что-то плохое или программа просто не скомпилится, т.к. не останется места для того самого нуль-символа.
Дополнительная информация здесь.