2015-08-11 3 views
-2

Приведен следующий кодИспользование Sprintf с форматом

char str[200]; 
str[0] = '\0'; 
double averrage[NUMBER_INPUTS]; 
for (int i = 0; i < NUMBER_INPUTS; i++) { 
    ... 

     sprintf(str, "%s%.3f;", str, averrage[i]); 
} 

Я пытаюсь понять Sprintf, но я не могу. Специально из-за переменной str.

Надеюсь, кто-нибудь может мне помочь, чтобы понять.

+1

Так как 'str' повторяется (повторно), то в результате числа будут конкатенированы. –

ответ

3

sprintf(str, "%s%.3f;", str, averrage[i]); является не определено поведение.

С sprintf(), пытаясь читать и писать одному и тому же указателю str делает для плохого кода.

... Если копирование происходит между перекрывающимися объектами, поведение не определено.
C11dr §7.21.6.6 2


Sample идея сцепить следующим образом.

char str[200]; 
str[0] = '\0'; 
char *p = str; 
double averrage[NUMBER_INPUTS]; 
for (int i = 0; i < NUMBER_INPUTS; i++) { 
    int n = sprintf(p, "%.3f;", averrage[i]); 
    if (n < 0) break; 
    p += n; 
} 
puts(str); 

Дополнительный код необходим для предотвращения переполнения str. Рассмотрим snprintf().

+0

у меня это работает, но я не выдержал его, когда я swa этот код;) – Doan

+1

@Doan Code печатает номер на 'p'. 'n' - количество напечатанных символов. Итак, 'p + = n;' updated 'p' до конца строки. – chux

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