2014-03-28 92 views
0

所以我試圖寫一個c程序,可以通過命令行讀取每行文件傳遞給它並打印出每行。我的代碼如下所示:如何使用scanf以空格讀取文件的每一行?

#include <stdio.h> 
#include <stdlib.h> 

int main(void){ 

     char num[20]; 
     for (;;){ 
       if((scanf("%[^\n]s", num)) != 1){ 
         break; 
       } 
       printf("%s\n", num); 
     } 
} 

UNIX命令行是:./printeachline < num.txt

的num.txt包括這些行:

 
01 0111111119 
111122222228 
123400000000 
1234kk444k44 
oooo11111111 
o dk39754i2oo 
002711111116 
124145245 246623 
0027111111167 
888888888888 
100900000011 

我很期待打印輸出是num.txt中的每一行,但是當我輸入命令時只打印第一行,即01 0111111119.我該如何解決這個問題?

回答

7

您的問題的答案不是如何使用scanf()來解決您的問題,而是使用fgets()來代替。 scanf()已知是容易出錯的,可能會導致緩衝器溢出等fgets()是被設計用來被用來處理每行的功能:

while (fgets(num, sizeof num, fp) != NULL) 
{ 
    printf("%s", num); 
} 

fpFILE *指針num.txt

+0

如果我想讀2個整數,而不是一個字符串呢? –

+1

@TomášZato使用'sscanf'從'fgets'獲取的字符串中讀取整數。 –

1

您可以使用fgets()或者如果您使用的是GNU C,則可以使用getline()逐行讀取輸入。或者您可以在程序中添加一個getchar(),然後該程序將工作。它讀取scanf()左邊的換行符。

#include <stdio.h> 
#include <stdlib.h> 

int main(void){ 

char num[20]; 
for (;;){ 
if((scanf("%[^\n]s", num)) != 1){ 
break; 
} 
printf("%s\n", num); 
getchar(); 
} 
} 
0

您的scanf在行尾保留換行符,所以下一個scanf將會失敗。添加一個getchar()來讀取並丟棄換行符。

但是,正如其他人所說,使用fgets代替。

相關問題