2014-01-14 4 views
0

Я читаю C primer Plus 5th edition, и я вхожу в раздел ввода/вывода. Я придумываю пример (стр. 451), который делает некоторые вещи, и в какой-то момент он создает новый файл, названный в честь существующего файла, но с окончанием .red. Например, если у меня есть этот файл «test», программа создает «test.red». Я не могу понять следующее.Назовите файл с тем же именем другого файла

char name[LEN]; 
//some code... 

strncpy(name,argv[1], LEN - 5); 
name[LEN - 5] = '\0'; 
strcat(name,".red"); 

Я посмотрел определение команды strcpy. Он копирует первые символы LEN-5 из arv [1] (содержит исходный файл) в имя. Команда strcat добавляет .red в конец. Однако я не могу понять существование этого name[LEN - 5] = '\0';. Я удалил его, и программа все еще работает хорошо.
EDIT
я отправляю комментарий из книги для этих линий ..

Чтобы построить новое имя для выходного файла, программа использует strncpy(), чтобы скопировать имя вихревым во имя массива. Аргумент LEN - 5 оставляет место для суффикса .red и конечного символа null. Никакой нулевой символ не копируется, если строка argv [2] длиннее LEN - 5, поэтому программа добавляет нулевой символ на всякий случай. Первый нулевой символ имени после вызова strncpy() перезаписывается периодом в .red, когда функция strcat() добавляет эту строку, , производя в этом случае eddy.red.

ответ

1

В C строки представляют собой просто массивы символов. Чтобы узнать, где заканчивается строка, после последнего символа добавляется символ «\ 0» (символ с нулевым символьным символом, называемый символом NUL в алфавите ASCII).

strncpy копирует самое большее количество символов, заданных его третьим аргументом, и нет гарантии, что копия будет завершена с NUL. Назад, когда была разработана strncpy, хранилище было более ограниченным, чем сегодня, и даже один байт был важен. Поскольку, если бы вы знали, что, скажем, 14 символов были максимальными для определенной строки, можно было бы хранить 14-символьную строку без завершающего символа NUL.

Таким образом, при работе с strncpy, если строковая копия должна использоваться в других функциях C, таких как strcat, необходимо добавить этот отсутствующий символ NUL, в случаях, когда strncpy не копировал его.

Это может сработать в любом случае, если в этом месте есть символ NUL с самого начала, но это не то, на что вы полагаетесь, или что компилятор вам поможет.

+0

Понял это! Спасибо! – yaylitzis

Смежные вопросы