2013-06-12 32 views
1

我有一臺Linux機器。讀標準輸入以塊...(可能與scanf函數?)

在此Linux中,有一個項目。

在這個程序中,我有這樣一個循環:

int num=*"what num needs to be"*; 
char proc[num]; 

int result; 
while (1) { 
result=scanf("%[^'&']%s",proc); 
printf("And proc is: %s\n",proc); 
printf("Result counter was: %i\n",result) 
if (result == 0) break; 
} 

scanf("%[^'&'],%s",proc) 
printf("post lop result is: %s", proc); 

正如你可能已經猜到了,標準輸入包含我需要的「&」字符劃定的數據。

正如我希望有人更熟練比我已經猜到了,輸出看起來是這樣的:

And proc is: *first delineated section* 
Result counter was: 1 
And proc is: *first delineated section* 
Result counter was: 0 
post loop result is: *first delineated section* 

我認爲scanf函數應該消耗標準輸入它已經讀的一部分。爲什麼不這樣做?

此外,供參考:這是被一個很便宜的,慢的服務器上運行。體積可能會或可能不會超過輕微。效率是這樣一個加號,我接受但有人可能會認爲我這樣做....

謝謝!

回答

0

的問題是,在第二次迭代scanf函數不能讀你給它(線路從標準輸入讀取不匹配),而不會修改PROC格式。這也是它返回0的原因:它已經成功讀取(並因此修改)了0個字段。

2

該scanset不需要兩個單引號 - 如果你想打破單引號就足夠了,但我懷疑你只想在&停下來,下面的代碼也假設了這一點。一旦你讀到第一個&,你需要一些代碼來閱讀&。在使用返回的數據之前,您需要檢查scanf()的結果。

因此:

int num = 100; 
char proc[num]; 

int result; 
while ((result = scanf("%99[^&]", proc)) == 1) 
{ 
    printf("And proc is: <<%s>>\n", proc); 
    printf("Result counter was: %i\n", result); 
    int c; 
    while ((c = getchar()) != EOF && c != '&') 
     ; 
} 

您還需要決定是否換行標記字段的結尾太...如果他們這樣做,那麼:

int num = 100; 
char proc[num]; 

int result; 
while ((result = scanf("%99[^&\n]", proc)) == 1) 
{ 
    printf("And proc is: <<%s>>\n", proc); 
    printf("Result counter was: %i\n", result); 
    int c; 
    while ((c = getchar()) != EOF) 
    { 
     if (c != '&' && c != '\n') 
     { 
      ungetc(c, stdin); 
      break; 
     } 
    } 
} 

注意使用%99[...]防止緩衝區溢出。尖括號<<%s>>只是標記字符串的開始和結束;例如,它們使尾隨空白和製表符可見。

的代碼假設你有一個C99的編譯器,其允許變量聲明中途的代碼塊。如果不是,則將int c;移動到循環頂部

+0

「scanf()」的格式指定它應該分配給兩個參數,但只傳遞一個參數。這是從提問者的原始代碼傳播出來的錯誤。 – jxh

+0

@jxh:謝謝;我應該編寫代碼 - drat! –

+0

謝謝,這確實清除了它! – user1833028