【问题标题】:loop running infinite time after calling display function调用显示函数后循环运行无限时间
【发布时间】:2021-09-03 10:22:02
【问题描述】:
do
{
    printf("1 :Enter Company Deatils\n");
    printf("2 :Display stoke Deatils\n");
    printf("0 :Exit\n");
    printf("\nEnter num: ");
    scanf("%d", &n);
    switch (n)
    {
        case 1:
            enter();
            break;
        case 2:
            display();
            break;
    }
}
while (n != 0);

当我输入2 之后调用显示函数时scanf() 不接受任何输入并无限期地运行循环。

void display_d(){
    point c1;
    FILE *fptr;
    fptr = fopen("company_det.txt","r");
    while(fread(&c1,sizeof(point),1,fptr)){
        printf("\n%s %s %d\n",c1.company_name,c1.bla.date,c1.bla.price);
    }
    fclose(stdin);
}

这是我的显示功能

【问题讨论】:

  • fflush(stdin); 导致未定义的行为。见stackoverflow.com/questions/2979209/using-fflushstdin
  • 这看起来像 C。c++ 标签是否相关?
  • @yun 删除 fflush(stdin);还是有同样的问题
  • 那么display()函数一定包含无限循环?否则代码看起来很好。
  • 无效显示(){点c1;文件 *fptr; fptr = fopen("company_det.txt", "r"); while (fread(&c1, sizeof(point), 1, fptr)) { printf("\n%s %s %d\n", c1.company_name, c1.bla.date, c1.bla.price); } fclose(stdin);} ///我的显示函数

标签: c switch-statement infinite-loop do-while


【解决方案1】:

函数display_d() 关闭stdin。当函数返回时,scanf 将尝试使用stdin 读取另一个数字。这是未定义的行为 (see answers here)。

您可能打算关闭文件而不是 stdin

此外,还应检查fopen 的返回值。如果fopen 无法打开文件,则为NULL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 2020-11-24
    相关资源
    最近更新 更多