2014-11-24 3 views
0

У меня есть программа, которая считывает содержимое файла и сохраняет его в buf. После прочтения содержимого предполагается скопировать два символа в массив. Этот код отлично работает, если я не пытаюсь читать из файла, но если я попытаюсь прочитать его из файла, printf из буфера печатает два символа, которые я хочу, но добавляет странные символы. Я подтвердил, и он корректно сохраняет в buf, никаких странных символов. Я не могу понять, что случилось ... Вот код:C программная печать странных символов

char *buffer = (char*)malloc(2*sizeof(char)); 
char *dst = buffer; 
char *src = buf; 
char *end = buf + strlen(buf); 
char *baby = '\0'; 
while (src<= end) 
{ 
    strncpy(dst, src, 2); 
    src+= 2; 
    printf("%s\n", buffer); 
} 
+0

Попробуйте выделить '3 * sizeof (char)' вместо '2 * sizeof (char)' (+1 для '\ 0') и не забывайте назначать' \ 0' в конце ' буфер –

ответ

1
  1. (char*)malloc(2*sizeof(char)); изменения malloc(3*sizeof*buffer); Вам нужны дополнительные байты для хранения завершающего нулевого символа, который используется для обозначения end-of-string. Aslo, не бросайте возвращаемое значение malloc(). Благодаря размотать

  2. В вашем случае, с strncpy(), вы поставили n в 2, который не имея никаких возможностей для хранения завершающего нулевого байта. без запрещающего нуля, printf() не будет знать, где остановиться. Теперь, с 3-мя байтами памяти, вы можете использовать strcpy(), чтобы скопировать строку правильно

strncpy() будет не добавить сам нуль-терминатор, в случае n равен размеру прилагаемым буфера, таким образом, становится очень очень ненадежный (в отличие от strcpy()). Вы должны позаботиться об этом программно.

проверьте страницу руководства для strncpy() and strcpy() здесь.

+0

Омг, большое вам спасибо! Он работает – ninjacow55

+0

@ user3760729 Приятно слышать это. Если это решит вашу проблему, вы можете рассмотреть «принять» -в этот ответ, щелкнув «tick» в левой верхней части моего сообщения. –

+0

[Не рекомендуется указывать возвращаемое значение 'malloc()' в C] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc). Кроме того, 'strncpy()' добавит прекращение, если это возможно, но не всегда, что делает его сложным и не рекомендуется. – unwind

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