如何使do while循环正常工作?

问题描述

在此代码中,第二个do while循环无法正常工作。每当我按y再次输入时。它只是一次又一次地重复Enter again [y/n]选项,而不是从第二个do-while loop开始。我不想让我选择一次又一次输入身份证号码。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    FILE *fr = fopen("file.csv","r");
    char string[200],toFind[200],opt;
    int err = 0;
    char *line1 = NULL;

    do {
        printf("Enter ID Card number: ");
        scanf("%s",toFind);
        if (strlen(toFind) != 13) {
            break;
        }

        do {     // This loop is not working properly
            {
                err = 1;
                while (fgets(string,200,fr)) {
                    line1 = strtok(string,"\n");
                    printf("%s\n",line1);
                    err = 0;
                }
            }
            printf("Repeat again [y/n]: ");
            scanf("%s",&opt); 
        } while (opt == 'y');
    } while(err);

    return 0;
}

解决方法

首先,您不得使用%s指令将输入读取到单个char中。这是为了读取非空字符串输入,因此它将始终存储至少两个个字符,最后一个是字符串终止符。单个char没有足够的空间,因此您的程序具有未定义的行为。您可以改用%c,但要注意后者是少数几个不会导致前导空格被跳过的字段指令。

每当我按y再次输入时。它只是一次又一次地重复输入[y / n]选项,而不是从第二个do-while循环开始。

即使我们认为覆盖变量opt的边界没有可观察到的效果,您也会误解:当循环循环到新的迭代时,它又在循环体的开头重新开始。

但是到达那里时它将做什么?考虑到首先要到达scanf,程序必须首先到达并通过while(fgets(string,200,fr))循环。该循环的主体中没有gotobreak,因此只有在fgets()返回空指针(表明它已到达文件末尾)时,它才会终止)或遇到I / O错误。当控制循环回到那个循环时,文件fr并没有改变。它仍然位于文件的末尾(或仍处于错误状态),因此有充分理由期望下一个fgets()将再次返回空指针,因此该循环的主体为甚至没有执行一次。

也许您想在rewind(fr)循环之前进行fgets(),以便您可以再次读取文件,但是我不清楚该循环的要点,所以我不确定是否真的有道理。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...