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

问题描述

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

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

这是程序的一部分:

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()?

感谢您的帮助。

解决方法

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

函数 ungetc() 可能正是您要找的。​​p>

然而,清理输入缓冲区是 C 中经常出现的主题。请注意 fflush(stdin) 是一种未定义行为,因为它实际上没有意义:刷新缓冲区不会丢弃其内容,它实际上会立即触发其向最终目的地的运送,即在输入缓冲区的情况下……您自己!

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

,

不要使用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);
}

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

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...