2013-10-17 35 views
1

我有一些問題與此代碼退出一個do while循環!使用C中的scanf = EOF使得3次額外的迭代

我想通讀標準輸入一個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指令被已經被讀取。所以,問題從第五行開始,「增量...」

隨着那行,我期望的輸出,如:print!但我得到:

print! print! print!

(與incr相同)

讀取incrprint開始與代碼的特定部分: char mystring [20];

ñ OTE: 使用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: %d\n", casenumber); 
      break; 
     } 
     casenumber = 0; 
    } while (fgets (mystring , 21 , stdin) != NULL); 
+2

回顧代碼上SO是痛苦的結果。 – haccks

+3

你的do-while應該是'while(scanf(「%19s」,mystring)== 1){...}'你在得到它後馬上忽略結果,然後把'mystring []'它實際上工作。說實話,你應該通過'fgets()'來處理這個問題' – WhozCraig

+1

爲什麼你發佈所有與這個問題無關的代碼?請嘗試將其降低爲顯示問題的最小示例。 –

回答

0

你試過打印scanf函數的結果呢?

scanf不讀一行,它讀取一個簡單的字符串,所以你的代碼會循環多次,比你所期望的要多。

其他問題...

清除您的變量在每次循環中運行。

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

和測試的scanf

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

不錯的主意!我現在就試試吧! – Gera