30

此代码之间有什么区别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;
}

scanf()当我在格式说明符之后添加空格时,该函数实际上是如何工作的scanf("%d ", &j);

4

4 回答 4

30

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

使用您的代码:

printf("enter a value for j ");

scanf("%d  ",&j);

printf("j is %d \n", j);

它会打印第一行然后等待你输入一个数字,然后继续等待数字后面的东西。因此,如果您只输入5Enter,它会出现挂起 - 您需要输入另一行,其中包含一些非空白字符才能继续。如果您然后键入6Enter,那将成为 的值i,因此您的屏幕将如下所示:

enter a value for j 5
6
j is 5
enter a value for i i is 6

此外,由于大多数 scanf %-conversions 也会跳过前导空格(除%c,%[和之外的所有空格%n), %-conversions之前的空格是不相关的("%d"并且" %d"行为相同)。所以在大多数情况下,你应该避免在 scanf 转换中使用空格,除非你知道你特别需要它们来实现它们的特殊效果。

于 2013-10-21T16:03:46.940 回答
6

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

  scanf("%d  ",&j);

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

于 2013-10-21T16:01:34.363 回答
4

您的scanf格式中的空白字符匹配任意数量的空白字符,如isspace. 因此,如果您有拖尾空格、换行符、制表符或任何其他空白字符,那么它也会scanf在返回之前被消耗掉。

于 2013-10-21T15:52:46.570 回答
0

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

"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
于 2013-10-21T15:51:32.427 回答