Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scanf()格式字符串中尾随空格的效果如何?_C_Scanf - Fatal编程技术网

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
区别(虽然很明显)是不同的格式字符串。如果输入以下行:

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

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

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

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

  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转换中应避免使用空格。

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