检查输入是否为 ENTER 而不会丢失 C 中的第一个字符

Checking if input is a ENTER without losing the first character in C

我有一个程序,其中有大量数据存储在文件中并加载到结构中。

我有一个选项,因此用户可以更改一些信息,但由于我不知道他想更改什么,我需要 printf 和 scanf 他想更改的项目的所有信息。

这是节目的一部分:

char check;
    
if(p->vetor.id == jogo){
            
    printf("Reference: %d\n", jogo);
        fflush(stdin);
    printf("\nTeam 1: ");
        if(getchar() != '\n'){ // METHOD 1
            gets(p->vetor.eqTeam1); 
        }
        fflush(stdin);
        
    printf("\nTeam 2: ");
        if(scanf("%c", &check) && check != '\n'){ //METHOD 2
            gets(p->vetor.eqTeam2);
        }
        fflush(stdin);
}

它检查输入是否为 ENTER(并且它有效)但是当我在那里写东西时它“吃掉”第一个字母因为它需要在是否为 ENTER 之前检查,有没有办法给出丢失的信回到 gets() ?

感谢您的帮助。

不要使用 scanf 并且 永远不会再使用 使用 gets.

您的问题只需使用fgets

即可解决
printf("\nTeam 2: ");
fflush(stdout);
char input[256];  // same size of eqTeam
fgets(input, sizeof(input), stdin);
if (input[0] != '\n') {
    strcpy(p->vetor.eqTeam2);
}

这将始终读取整行,但如果该行的第一个字符是换行符,则用户只需按回车键。如果第一个字符是其他字符,则将输入复制到正确的位置。注意输入缓冲区的大小一定要合适,这里我只是猜的肯定不正确(但我缺少必要的信息)

还有一件事,永远不要刷新 stdin,你必须 fflush(stdout) 因为 fflush 是一个输出操作。

It checks if the input is a ENTER (and it works) but when I write something there it "eats" the first letter because it needs to check before if is a ENTER or not, is there a way to give the lost letter back to the gets() ?

函数 ungetc() 可能就是您要找的。

但是,清理输入缓冲区是 C 中反复出现的主题。请注意 fflush(stdin) 是一种 未定义的行为 ,因为它实际上没有任何意义:刷新缓冲区不会丢弃它的内容,它实际上会触发它立即运送到它的最终目的地,也就是说,在输入缓冲区的情况下……你自己!

一些系统利用这种未定义的行为情况来按预期实际删除它(这是一种未定义的行为,就像其他任何事情一样),但这是一个陷阱,因为程序员习惯于做一些没有定义的事情应该工作。在我看来,这里最一致的行为是什么都不做,因为缓冲区的内容 已经 可用于 reader.