在使用循环期间或在任何其他情况下,有什么方法可以停止先前的工作输入?

问题描述

当我在循环中使用fgets时,它将前一个工作的enter命令作为输入并对其进行处理,这不仅发生在fgets中,而且在许多其他情况下也发生在我身上,所以我的问题是....

1。是否可以在开始任何循环时停止前面的工作命令?

2。如果不是,请告诉我如何解决此问题?

程序

#include <stdio.h>
#include <strings.h>

struct student
{
    char name[10];
}st[10];


int main()
{
    int i,j;
    printf("enter the number of students=");
    scanf("%d",&i);
    j=i;

    for (i=1;i<=j;i++)
    {
        printf("enter the student's name= ");
        fgets(st[i].name,sizeof(st[i]),stdin);
        printf("%s",st[i].name);
    }

}

输出

enter the number of students=2                                                                     
enter the student's name=                                                                          
enter the student's name= hello                                                                    
hello    

请参阅此处,它从第二行开始输入,即,将第一输入作为回车键并移至第二输入

解决方法

您可以通过使用fflush刷新标准输入缓冲区来做到这一点...请参见下面的代码:

#include <stdio.h>
#include <strings.h>

struct student
{
    char name[10];
}st[10];


int main()
{
    int i,j;
    printf("enter the number of students=");
    scanf("%d",&i);
    j=i;

    for (i=1;i<=j;i++)
    {
        
        fflush(stdin); // flush the stdin buffer

        printf("enter the student's name= ");
        fgets(st[i].name,sizeof(st[i]),stdin);
        printf("%s",st[i].name);
    }
    return 0;
}

输出为:

enter the number of students=2
enter the student's name= hello
hello
enter the student's name= world
world

使用fflush(stdin)的问题:

尽管fflush(stdin)有效,但实际上并不是完美的解决方案。 fflush(stdin)有一些潜在的问题。请看看here。而且在online gdb的情况下,fflush(stdin)根本无法工作。

因此,我提出了一种替代解决方案。它可以在online gdb和您的本地计算机中完美运行:

问题是末尾输入数字的uneaten '\n'。它保存在stdin的缓冲区中。所以,我们只需要吃它。因此,我们将只编写一个scanf("%d%c",&i,&uneaten_newline_char)。完整代码:

#include <stdio.h>
#include <strings.h>

struct student
{
    char name[10];
} st[10];


int main()
{
    char uneaten_newline_char;
    int i,j;
    printf("enter the number of students=");
    scanf("%d%c",&uneaten_newline_char); // notice,there's no space between '%d%c',they must be written without any space between them
    j=i;

    for (i=1;i<=j;i++)
    {
        
        // fflush(stdin); // flush the stdin buffer

        printf("enter the student's name= ");
        fgets(st[i].name,stdin);
        
        printf("%s",st[i].name);
    }
    return 0;
}

此解决方案可能看起来有些丑陋...但这比使用fflush(stdin)更好。但是对我来说,最美丽,最完美的解决方案是使用您自己的阅读器功能。创建自己的readline函数。并根据需要在最后处理空格和换行符。在这种情况下,c的内置函数肯定不是很好。

,

使用fflush(“ stdin”);在fgets之前 它将清除包含“ enter”或“ / n”的输入缓冲存储器。 因为,scanf的行为是在遇到空间后停止接受输入。 因此它将“ enter”或“ / n”留在缓冲存储器中。

相关问答

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