1

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

任何帮助将不胜感激,谢谢!

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

**fmt 是一个字符数组。

4

1 回答 1

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 (

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

更改第四行代码以确保字符串有足够的空间容纳可见字符和终止 null,但仅此而已,即:

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 数组初始化困境

于 2013-01-14T09:29:39.120 回答