我正在编写的代码的一部分必须从数组的输入中读取由空格分隔的整数序列。例如,当我输入 3 个数字,然后按 Enter 时,它工作正常。但是,如果输入数字后我按空格然后按 Enter,它会转到新行并等待我输入更多数字。我怎样才能避免这种情况?
#include <stdio.h>
#include <stdbool.h>
#define MAX_VALUES 250000
int main()
{
int sequence[MAX_VALUES];
int count = 0;
do{
scanf("%d", &sequence[count++]);
}
while (getchar() != '\n');
for(int i=0; i<count; i++)
printf("Element is: %d\n", sequence[i]);
return 0;
}
想想你的代码是做什么的,例如对于以下输入:
1 \n
。
scanf
消耗1
getchar
消耗
scanf
看到\n
并会等待,直到号码到达。这就是您看到这种不良行为的原因。
解决此问题的一个简单方法是检查并跳过每个
scanf
之后的空格:
#include <stdio.h>
#define MAX_VALUES 250000
int main()
{
int sequence[MAX_VALUES];
int count = 0;
char c;
do {
scanf("%d", &sequence[count++]);
do {
c = getchar();
} while (c == ' ');
} while (c != '\n');
for (int i = 0; i < count; i++) {
printf("Element is: %d\n", sequence[i]);
}
}
另一个答案已经回答了为什么你的程序不起作用,所以我不会讨论这个。但我认为这个问题还有另一种解决方案。您可以先读取整行,然后使用
sscanf
提取整数:
#include <stdio.h>
#include <stdbool.h>
#define MAX_VALUES 250000
/* You don't want to declare such big arrays inside functions.
Make them global or use malloc */
char line[MAX_VALUES * 10];
int sequence[MAX_VALUES];
int main()
{
int ret = 0, len;
size_t count = 0, off = 0; // I recommend using size_t for indexing
/* scanf reads the whole line (there are better ways to do this,
but I want to keep it simple) */
scanf("%[^\n]", line);
while ((ret = sscanf(line + off, "%d%n", &sequence[count++], &len)) != EOF) {
off += len;
}
--count;
for(int i = 0; i < count; i++) {
printf("Element is: %d\n", sequence[i]);
}
return 0;
}