水平循环扫描

时间:2018-10-13 06:09:59

标签: c scanf

如果我使用此代码:

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

例如,如果

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

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

3
4
3
1

我想编写一个代码,该代码将水平scanf循环中的第二个for循环,而无需按回车键(但使用空格)直到循环结束,就像这样:

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

2 个答案:

答案 0 :(得分:0)

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

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

有关scanf的在线reference信息,请参见scanf的工作原理。

答案 1 :(得分:0)

您可以在一行中键入计数和条目,并用空格分隔,并且当前代码将以不间断的流程解析它们,因为scanf()会跳过%d的值之前的所有空白,它是空格,制表符,换行符...

请注意,格式" %d"是多余的:%d会跳过整数前的所有待处理空格,格式字符串中的空格表示的是完全相同的东西。只需使用scanf("%d", &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;
}