getchar() 在回车前键入空格时提示输入

getchar() prompting for input when typing space before Enter

提问人:Nare Avetisyan 提问时间:11/15/2023 最后编辑:Abderrahmene Rayene MihoubNare Avetisyan 更新时间:11/16/2023 访问量:62

问:

我正在编写的代码的一部分必须从输入中读取由空格分隔的整数序列到数组中。

例如,当我输入 3 个数字,然后按 .但是,如果在输入数字后我按下,然后,它会转到新行并等待我输入更多数字。EnterSpaceEnter

我怎样才能避免这种情况?

#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;
}
数组 c 序列 getchar

评论


答:

1赞 ChrisB 11/15/2023 #1

想想你的代码是做什么的,例如,对于以下输入:.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]);
    }
}
0赞 Nierusek 11/15/2023 #2

另一个答案已经回答了为什么你的程序不起作用,所以我不会介绍这个问题。但我认为这个问题还有另一种解决方案。你可以先读取整行,然后用来提取整数: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;
}