在我第一次运行这个 do/while 循环后,输出似乎总是在 printf 之前有一个额外的空间。我认为这可能与缓冲区溢出有关,但我不太确定如何摆脱它。
任何帮助将不胜感激,谢谢!
do {
printf("Enter a format specifier: ");
scanf(" %c", fmt+1);
printf(fmt, value);
} while(*(fmt+1) != 'q');
**fmt 是一个字符数组。
在我第一次运行这个 do/while 循环后,输出似乎总是在 printf 之前有一个额外的空间。我认为这可能与缓冲区溢出有关,但我不太确定如何摆脱它。
任何帮助将不胜感激,谢谢!
do {
printf("Enter a format specifier: ");
scanf(" %c", fmt+1);
printf(fmt, value);
} while(*(fmt+1) != 'q');
**fmt 是一个字符数组。
我将您的代码扩展为一个完整的程序,如下所示:
#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 数组初始化困境。