如果我使用此代码:
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]);
答案 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;
}