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