区别(虽然很明显)是不同的格式字符串。如果您输入以下行:
"3 "
scanf()
将成功返回。否则,这取决于您提供的输入。scanf()
基本上跳过空格(制表符、空格、换行符),并在输入流中搜索字母数字值。由于这是尾随空格,因此在按 时,它会与输入末尾的尾随换行符混为一谈ENTER,因此影响不大。
scanf()
期望提供的输入与您提供给它的格式字符串完全匹配,但连续的空白字符被压缩为单个空白字符。如果您想使用与字符串处理等效的sscanf()
.
进一步测试这一点的一个很好的练习是:
#include<stdio.h>
int main(void)
{
int a=0,b=0,c=0;
printf("Enter values for A, B, C, in the format: \"A B - C\"\n");
scanf("%d %d - %d", &a, &b, &c);
printf("Values: A:%d, B:%d, C:%d\n", a, b, c);
}
然后,在提供正确和错误格式的控制台输入(即:空格和连字符)后,检查并查看这些整数的值。这是几个示例运行。第一个使用了不正确的输入,第二个使用了正确格式的输入。请注意,在第一种情况下,C
甚至没有设置,scanf()
如果输入和格式字符串不匹配,则会提供意外行为。一般来说,你最好使用类似fgets()
从用户那里获取输入字符串,然后使用各种搜索函数(即:strstr()、strch()、strcat、strcpy 等)来解析你的字符串,因为它比仅仅使用scanf()
并假设用户不会意外或故意犯错要安全得多。
Enter values for A, B, C, in the format: "A B - C"
1 2 3
Values: A:1, B:2, C:0
Enter values for A, B, C, in the format: "A B - C"
1 2 - 3
Values: A:1, B:2, C:3
现在,考虑最后一次运行:您会看到将scanf()
多个连续的空白字符压缩为一个字符,因此这些最终运行实际上成功了:
Enter values for A, B, C, in the format: "A B - C"
1 2 - 3
Values: A:1, B:2, C:3
Enter values for A, B, C, in the format: "A B - C"
1 2 - 3
Values: A:1, B:2, C:3