首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >水平循环scanf

水平循环scanf
EN

Stack Overflow用户
提问于 2018-10-13 14:09:59
回答 2查看 504关注 0票数 1

如果我使用以下代码:

代码语言:javascript
运行
复制
int a, b[100];
scanf("%d", &a);
for (int x = 0; x < a; x++) {
    scanf(" %d", &b[x]);
}

例如,如果

第一个输入:3

第二个输入:4

第三个输入:3

第4个输入:1

屏幕上的输出将如下所示(因为我在每次循环的scanf末尾使用enter )

代码语言:javascript
运行
复制
3
4
3
1

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

代码语言:javascript
运行
复制
scanf(" %d %d %d", &b[x], &b[x+1], &b[x+2]);
EN

回答 2

Stack Overflow用户

发布于 2018-10-13 15:10:36

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

因此,在这种情况下,是否使用ENTER (换行符)或空格(单个或多个)对读取输入值没有影响。

有关scanf如何工作的更多详细信息,请参阅此适用于scanf的在线reference

票数 0
EN

Stack Overflow用户

发布于 2018-10-13 15:12:53

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

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

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

以下是修改后的版本:

代码语言:javascript
运行
复制
#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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52790051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档