问题描述
我有一个程序,其中有大量数据存储在一个文件中并被加载到结构中。
我有一个选项,因此用户可以更改一些信息,但由于我不知道他想要更改什么,我需要 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
是一个输出操作。