scanf()格式字符串中尾随空格的效果如何?

scanf()格式字符串中尾随空格的效果如何?,c,scanf,C,Scanf,此代码中的scanf(“%d”)和scanf(“%d”)之间有什么区别,区别是格式字符串中的尾随空格 #include <stdio.h> int main(void) { int i, j; printf("enter a value for j "); scanf("%d ",&j); printf("j is %d\n", j); printf("enter a value for i "); scanf("%d",

此代码中的
scanf(“%d”)
scanf(“%d”)
之间有什么区别,区别是格式字符串中的尾随空格

#include <stdio.h>

int main(void)
{
    int i, j;

    printf("enter a value for j ");
    scanf("%d  ",&j);
    printf("j is %d\n", j);
    printf("enter a value for i ");
    scanf("%d", &i);
    printf("i is %d\n", i);
    return 0;
}
#包括
内部主(空)
{
int i,j;
printf(“输入j的值”);
scanf(“%d”和“&j”);
printf(“j是%d\n”,j);
printf(“输入i的值”);
scanf(“%d”、&i);
printf(“i是%d\n”,i);
返回0;
}
当我在格式说明符后面添加空格时,
scanf()
函数实际上是如何工作的,比如
scanf(“%d”和&j)

区别(虽然很明显)是不同的格式字符串。如果输入以下行:

“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);
}
enter a value for j 5
6
j is 5
enter a value for i i is 6

现在,考虑最后一次运行:您将看到<代码> ScSff()/Cux>将多个连续的空白字符压缩到单个字符,因此为什么这些最终的运行实际上成功了:

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

scanf
格式中的空白字符与
isspace
所述的任意数量的空白字符匹配。因此,如果您有尾随空格、换行符、制表符或任何其他空白字符,则在返回之前,它也将被
scanf
使用。

格式字符串中的空白字符(空格、换行符、水平和垂直制表符)与输入中的任意数量的空白字符匹配。
在你的第一个案例中

  scanf("%d  ",&j);

当它遇到空格字符(WSC)
'
时,它将吃掉用户输入的所有空格,包括按Enter键时输入的
\n
,并希望输入非WSC。在这种情况下,您的程序将通过按Ctrl+Z终止。

scanf格式的空白字符会导致它显式读取并忽略尽可能多的空白字符。因此,使用
scanf(“%d”,…
),在读取一个数字后,它将继续读取字符,丢弃所有空白,直到在输入上看到一个非空白字符。该非空白字符将保留为输入函数要读取的下一个字符

使用您的代码:

printf("enter a value for j ");

scanf("%d  ",&j);

printf("j is %d \n", j);
它将打印第一行,然后等待您输入一个数字,然后继续等待数字后面的内容。因此,如果您只键入5Enter,它将显示为挂起-您需要键入另一行并在其上键入一些非空白字符以继续。如果您随后键入6Enter,则该值将成为
i
的值,因此您的屏幕将类似于:

#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);
}
enter a value for j 5
6
j is 5
enter a value for i i is 6

此外,由于大多数scanf%-转换也会跳过前导空格(除了
%c
%[
%n
),所以在%-转换之前的空格是不相关的(
%d”
%d”
的作用相同)。因此,在大多数情况下,除非您知道需要特殊效果,否则应避免在scanf转换中使用空格。

该命令是否会在posix系统中终止,而该命令位于最上面的进程?@Dogbert;不确定,但对于MS-WIN:
Ctrl+D
-1:这些示例中格式字符串中的所有空格都是完全不相关,可以在不改变结果的情况下删除,因此这并不能真正回答问题,这是关于格式字符串中的尾随空格…它总结了不同的空格字符是如何被集中到一个单独的字符中的,以及在这个特定示例中尾随空格是如何无关紧要的还描述了格式字符串如何从本质上减少为预期的空白和非空白模式,以及如何根据输入偏离格式模式的时间为某些或所有目标变量赋值。我认为这是不必要的。代码应该记录并报告
scanf()中的返回值
。这将显示已设置的值的数量。格式字符串中的尾随空格对于交互式输入来说不是“小冲突”。这意味着用户必须键入除空格以外的字符(换行符是空格)输入完成之前。@chrisdd:格式中破折号前的空格之一有效;其他空格无效。如果破折号前没有空格(例如
%d%d-%d”
),则类似
23 34-45
的输入失败,因为输入中的空格与格式中的破折号不匹配(但
%d%d-%d)
就可以了。)您的要点是正确的;大多数空格在
scanf()格式字符串中都是无关紧要的,但并非所有空格都是无关紧要的-正是这些空格的微妙之处妨碍了
scanf()的使用
等。格式字符串中的尾随空格尤其有害!这并没有明确关键点-即
scanf()
在输入非空白的内容之前不会返回。这反过来意味着您必须猜测程序下一步要问什么,并在当前输入完成之前输入下一个值。(如果您不输入完整的下一个值,则会有更多问题;单数字符(以及在终端将字符发送到之前必须跟随的换行符。)