2013-04-20 6 views
0

Я нахожусь в полной потере с этим. Я не могу понять, почему это не работает. Простой массив символов с терминатором NULL - за исключением того, что когда я его выводю, он не заканчивается!Ментальный блок на завершении строки fprintf

int file_create(const char *path) { 
    //trying to trap situations where the path starts with /.goutputstream 
    char path_left_15[16]; 
    strncpy(path_left_15, path, 15); 
    printf("%d\n", strlen("/.goutputstream")+1); 
    path_left_15[strlen("/.goutputstream")+1] = '\0'; 
    printf("%d\n", strlen(path_left_15)); 
    printf("path_left_15: %s\n", path_left_15); 
    //continue on... 
} 

Это мой выход:

> 16 

> 16 

>/.goutputstream\B7<random memory stuff> 

Я не могу понять, почему это не правильно прекращения. Я попытался сделать массив длиннее, но каждый раз получаю тот же результат. Я теряю рассудок!

Кто-нибудь это видит? Благодарю.

+1

** f ** принтf? Вы не передаете указатель файла. – Kevin

+0

'NULL' - это макрос, который расширяется до константы * указателя null *. Предположительно, вы имеете в виду «NUL terminator» или, еще лучше, «' '\ 0'' terminator». –

+0

Вы правы, Кевин. Я имел в виду просто printf. Хороший улов. – Alex

ответ

1

Вы не связаны из массива. Вместо path_left_15[strlen("/.goutputstream")+1] = '\0'; попробуйте path_left_15[15] = '\0';

Вы усекаете свою строку, но будете в безопасности при печати.

+0

Я знал, что это закончится тем, что я понимаю, насколько я не могу быть. Еще один пример забывания, когда считать от 0 и когда начать с 1. Спасибо! – Alex

+0

Кстати, это не урезает мою строку. Добавив терминатор в path_left_15 [15], это 16-позиция моего массива - именно там, где я хочу. Еще раз спасибо. – Alex

2

В вашем массиве имеется только 16 элементов, которые вы пытаетесь записать на 17-й. Так что это неопределенное поведение.

+0

Я понимаю, что вы имеете в виду. Не могу поверить, что я этого не замечал. Благодарю. – Alex