问题描述
在此代码中,第二个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))
循环。该循环的主体中没有goto
或break
,因此只有在fgets()
返回空指针(表明它已到达文件末尾)时,它才会终止)或遇到I / O错误。当控制循环回到那个循环时,文件fr
并没有改变。它仍然位于文件的末尾(或仍处于错误状态),因此有充分理由期望下一个fgets()
将再次返回空指针,因此该循环的主体为甚至没有执行一次。
也许您想在rewind(fr)
循环之前进行fgets()
,以便您可以再次读取文件,但是我不清楚该循环的要点,所以我不确定是否真的有道理。