【发布时间】:2016-02-23 22:04:58
【问题描述】:
我是 C 新手。我在 C 的 puts 和 printf 中发现了一些问题。
char str[10];
printf("Input a string.\n");
gets(str);
printf("The string you input is: %s",str);
如果我输入超过 10 个字符,输出就是这些
1ang:lab lang$ ./exercise
Input a string.
warning: this program uses gets(), which is unsafe.
0123456789
Abort trap: 6
但是当我在 printf 的末尾添加\n 时,printf("The string you input is: %s\n",str); 的输出是不同的。
1ang:lab lang$ ./exercise
Input a string.
warning: this program uses gets(), which is unsafe.
0123456789
The string you input is: 0123456789
Abort trap: 6
它将首先打印字符串,然后发生错误。 谁能解释一下?
【问题讨论】:
-
'gets()' 已弃用,请改用 fgets()。
-
不 - 我们不在这里解释 UB。
-
我很确定这是一个缓冲问题。尝试在 %s 之后使用另一个
printf("\n")。并尽量避免得到,因为它是不保存的,正如你的 libc 所建议的那样。 -
请注意,即使对于“0123456789”,'char str[10]' 也太小了
-
无法解释未定义的行为。它只是未定义。使用
fgets而不是gets。