在 C 中使用 scanf 在 !=EOF 处退出 do while 循环会额外进行 3 次迭代



我对这段代码有一些问题

我正在尝试通过 stdin.txt读取,具体来说,我编译的步骤是:

g++ eda.c -o eda.exe
./eda.exe < eda.txt

.txt文件的内容是:

3
[9.3,1.2,87.9]
[1.0,1.0]
[0.0,0.0,1.0]
print v3
incr v3 v1

前 4 行现在没有兴趣,这些行已经通过 getline 指令读取。所以问题从第五行开始,"incr ..."

通过这一行,我希望输出如下: print! 但我得到:

print! print! print!

(与incr相同)

读取incrprint的代码的特定部分以以下内容开头: char mystring [20];

注意:使用 fgets() 解决!

这是最终代码:

do {
        //sscanf (mystring,"%s",str);
        //int res = strncmp(str, "incr", 10);
        if(mystring[0] == 'p') casenumber = 1;
        else if(mystring[0] == 'i') casenumber = 2;
        else if(mystring[0] == 'd' && mystring[1] == 'o') casenumber = 3;
        else if(mystring[0] == 'd' && mystring[1] == 'i') casenumber = 4;
        else if(mystring[0] == 'd' && mystring[1] == 'e') casenumber = 5;
        switch(casenumber)
        {
        case 1 :
            printf("print!n" );
            break;
        case 2 :
            printf("increase!n");
            break;
        case 3 :
            printf("dot!n");
            break;
        case 4 :
            printf("distance!n");
            break;
        case 5 :
            printf("decr!n");
            break;
       default :
            printf("casenumber value is: %dn", casenumber);
            break;
        }
        casenumber = 0;
    } while (fgets (mystring , 21 , stdin) != NULL);

您是否尝试过打印scanf的结果?

SCANF 不读取一行,它读取一个简单的字符串,因此您的代码将循环比您预期的更多次。

其他问题...

在循环内的每次运行中清除变量。

casenumber = 0;
memset(mystring, 0, sizeof(mystring));

并测试扫描结果

if ( result == 1 )
    printf("sscanf error");

最新更新