c-如何使do-white循环正常工作



在此代码中,第二个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("%sn", line1);
err = 0;
}
}
printf("Repeat again [y/n]: ");
scanf("%s", &opt); 
} while (opt == 'y');
} while(err);
return 0;
}

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

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

即使我们假设覆盖变量opt的边界没有可观察到的效果,你也错了:当循环循环到新的迭代时,它会在循环体的开头再次开始。

但当它到达那里时会做什么?考虑到,为了首先到达scanf,程序必须首先到达并通过while(fgets(string, 200, fr))循环。该循环的主体中没有gotobreak,因此只有当fgets()返回空指针时,它才会终止,这表明它已经到达文件末尾(很可能(或遇到I/O错误。当控制循环回到那个循环时,文件fr没有任何变化。它仍然位于文件的末尾(或者仍然处于错误状态(,因此完全有理由期待下一个fgets()将再次返回一个空指针,这样该循环的主体就不会执行一次。

也许你想在fgets()循环之前rewind(fr),这样你就可以再次读取文件,但我不清楚这个循环的意义,所以我不确定这是否真的有意义。

最新更新