【发布时间】:2017-01-20 12:40:35
【问题描述】:
在这段代码中,在为前两个 scanf 函数提供输入之后。输出会自动显示。我学习了这种形式的 scanf 字符串。但它并没有专门等待它。有什么建议么 ?
#include <stdio.h>
int main()
{
int p;
int q;
char kog[50];
scanf("%d",&p);
scanf("%d",&q);
scanf("%50[^ ]s",kog);
printf("%d %d %s",p,q,kog);
return 0;
}
【问题讨论】:
-
对于交互式输入读取 lines.
-
您的扫描集将允许制表符和换行符,但不允许空白。它类似于
%50s。此外,您必须指定不包括空字节的长度,因此您需要在格式中使用49而不是50(或将数组维度更改为51)以确保安全。 off-by-one 是历史性的,因此是神圣不可侵犯的,但不幸的是与大多数其他指定缓冲区长度的函数不一致。如果数字在不同的行上,您可能希望在扫描集 (" %49[^ ]") 之前有一个空格,以跳过前一个%d留下的换行符。 -
关于这一行:
scanf("%50[^ ]s",kog);用于 char 字符串输入的函数scanf()将始终附加一个 NUL 字节,因此语句应为:scanf("%49[^ ]s",kog);。此外,[...] acts to input a string, so the trailings` 不应该在那里。使用:scanf("%49[^ ]",kog);