虽然显而易见,但区别在于不同的格式字符串。如果您输入以下行:
"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
" %c"
或在消耗时挂起(正如此问题所示)。除此之外,还有一个含义上的区别 - 尾随 空格 = 总是不好的;前导 空格 = 可以有用。我知道你想要表达什么,但问题已经很具体了,并且已经有了答案。更改标题将需要更改答案(包括示例等)。 - RobertS supports Monica Cellio