【问题标题】:Looping scanf horizontally水平循环scanf
【发布时间】:2018-10-13 06:09:59
【问题描述】:

如果我使用此代码:

int a, b[100];
scanf("%d", &a);
for (int x = 0; x < a; x++) {
    scanf(" %d", &b[x]);
}

例如如果

第一个输入:3
第二个输入:4
第三个输入:3
第四个输入:1

屏幕上的输出将是这样的(因为我在每个循环的scanf 末尾都使用了回车)

3
4
3
1

我想编写一个代码,它将水平循环for 循环中的第二个scanf,而不按回车键(但使用空格)直到循环结束,如下所示:

scanf(" %d %d %d", &b[x], &b[x+1], &b[x+2]);

【问题讨论】:

  • 你是否尝试使用空间,而不是进入?如果你输入4 0 1 2 3&lt;enter&gt;,你应该最终得到a = 4b[] = {0, 1, 2, 3}

标签: c scanf


【解决方案1】:

scanf 函数将读取并忽略在下一个非空白字符之前遇到的任何空白字符(空白字符包括空格、换行符 和制表符)。格式字符串中的单个空格会验证从流中提取的任意数量的空格字符(包括无)。

因此,在这种情况下,无论您使用 ENTER(换行符)还是 SPACE(单个或多个)都不会影响读取输入值。

有关 scanf 工作原理的更多详细信息,请参阅此在线 reference scanf

【讨论】:

    【解决方案2】:

    您可以在一行中键入计数和条目,以空格分隔,当前代码将在一个不间断的流中解析它们,因为scanf() 会跳过%d 值之前的任何空格,无论是空格,制表符、换行符...

    请注意," %d" 格式是多余的:%d 在整数之前跳过任何待处理的空格,格式字符串中的空格表示完全相同的意思。只需使用scanf("%d", &amp;b[x]);

    另请注意,您应该添加安全检查以避免扫描超出数组末尾的值,并且您应该测试 scanf() 的返回值以避免无效输入出现未定义的行为。

    这是修改后的版本:

    #include <stdio.h>
    
    int main() {
        int a, x, b[100];
        if (scanf("%d", &a) == 1) {
            for (x = 0; x < 100 && x < a; x++) {
                if (scanf("%d", &b[x]) != 1)
                    break;
            }
            printf("read %d values:", x);
            for (int i = 0; i < x; i++)
                printf(" %d", b[i]);
            printf("\n");
        }
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-29
      • 1970-01-01
      • 2020-02-16
      • 1970-01-01
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      • 2012-04-09
      相关资源
      最近更新 更多