2014-02-10 3 views
0

Linux Kernel = 2.6.32-41-родовое # 94-Ubuntu
Язык: CКак Sprintf работает в C

фрагмент кода:

#include <stdio.h> 
int main() 
{ 
    char buf[5]; 
    int index = 0; 

    for (index = 0; index < 5; index++) 
    { 
     sprintf(buf,"sud_%d", index); 
     printf("for index = %d\n",index); 
     printf("buf = %s\n",buf); 
    } 

    return 0; 
} 

Question1: Почему выше фрагмент кода переходит в цикл при выполнении вышеуказанного кода?
Question2: Требуется ли sprintf, чтобы его последний бит целевого буфера заполнялся 0 или '\ 0?

Если я сделал буфер размером 6 (buf [6]) в приведенном выше коде, он отлично работает.

может кто-нибудь, пожалуйста, дайте мне знать причину такого поведения?

С уважением, Sudhansu

ответ

4

Поскольку непредсказуемое поведение.

Выходной буфер buf только 5 символов большой, но первый вызов sprintf() будет генерировать строку "sud_0", которая требует 6 символов из-за терминатора. Затем он записывает за пределами buf, вызывая неопределенное поведение. Используйте snprintf().

snprintf() не «требует» последнего символа должны быть заполнены с чем , прежде чем вы называете его, но это будет убедиться, что он установлен в '\0'после вызов завершен. Это связано с тем, что он предназначен для создания полной и достоверной строки C в данном буфере, и поэтому он должен убедиться, что строка правильно завершена.

Это трудно (и некоторые говорят, что было бы бессмысленно) рассуждать о неопределенном поведении, но я подозреваю, что происходит в том, что шестой символ записывается в buf перетекает в index, записывая первый байт в 0. Если вы на это будет то же самое, что и index &= ~255. Так как значение index должно быть только от 0 до 5, оно сбрасывается до 0, что заставляет цикл продолжать навсегда.

+0

Привет, Спасибо, что ответили на вопрос, можете ли вы быть более конкретным, почему это происходит. Я добавил одно целое к опубликованной программе и, похоже, работает по своему желанию. Итак, вопрос в том, является ли проблема выравнивания памяти? #include int main() { char buf [5]; int index = 0; int i = 0; for (index = 0; index <5; index ++) { sprintf (buf, "sud_% d", index); printf ("для индекса =% d \ n", индекс); printf ("buf =% s \ n", buf); } возвращение 0; } С уважением, Sudhansu – user3292886

3

Вы пишете внешний объявленный буфер. Это неопределенное поведение.

Ваш char buf[5]; слишком мал. Для «sud_0» требуется не менее 6 символов из-за терминатора '\0'.

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