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”),…
,读取数字后,它将继续读取字符,丢弃所有空格,直到在输入中看到非空格字符。该非空格字符将作为下一个字符保留