使用scanf后输出中的额外空格(%c)

时间:2013-01-14 07:44:34

标签: whitespace scanf buffer-overflow

第一次运行do / while循环后,输出似乎总是在printf之前有一个额外的空格。我认为它可能与缓冲区溢出有关,但我不太清楚如何摆脱它。

非常感谢任何帮助,谢谢!

do {
   printf("Enter a format specifier: ");
   scanf(" %c", fmt+1);
   printf(fmt, value);
} while(*(fmt+1) != 'q');

** fmt是一个char数组。

1 个答案:

答案 0 :(得分:0)

我将您的代码扩展为完整的程序,如下所示:

#include "stdio.h"

main () {
    char fmt[2] = "% ";
    int value = 23;
    do {
        printf("Enter a format specifier: ");
        scanf(" %c", fmt+1);
        printf(fmt,value);
    } while(*(fmt+1) != 'q');
}

...并得到以下结果:

Enter a format specifier: i
23h (Enter a format specifier: d
23h (Enter a format specifier: x
17h (Enter a format specifier: o
27h (Enter a format specifier: q
qh (

这个输出与您所观察到的略有不同,但我认为它原则上可能是相同的。如果是这样,我认为这是你所怀疑的:一个缓冲区溢出错误是由于fmt被声明为一个char数组,这个数组不够长,不足以包含应该在任何C的末尾的null串。因此,printf()继续在格式字符之后写入随机数据,直到它碰巧遇到空值。

更改第四行代码以确保字符串有足够的空间用于可见字符和终止空值,但不多,即:

char fmt[] = "% ";

...给出了以下结果(可能是你想象的那样?):

Enter a format specifier: i
23Enter a format specifier: d
23Enter a format specifier: x
17Enter a format specifier: o
27Enter a format specifier: q
q

有关此问题的详细信息,请阅读Char array initialization dilemma