2011-08-14 50 views
0

我試圖用C程序(僅用於學習)模擬UNIX的grep 模式。我寫是給我一個運行時間錯誤的代碼..使用UNIX的read()系統調用來查找用戶給定的模式

#include <fcntl.h> 
#include <stdio.h> 
#include <string.h> 

#define MAXLENGTH 1000 
char userBuf[MAXLENGTH]; 

int main (int argc, char *argv[]) 
{ 
     int numOfBytes,fd,i; 


     if (argc != 2) 
       printf("Supply correct number of arguments.\n"); 
       //exit(1); 

     fd =open("pattern.txt",O_RDWR); 

     if (fd == -1) 
       printf("File does not exist.\n"); 
       //exit(1); 

     while ((numOfBytes = read(fd,userBuf,MAXLENGTH)) > 0) 
       ; 

     printf("NumOfBytes = %d\n",numOfBytes); 

     for(i=0;userBuf[i] != '\0'; ++i) 
     { 
       if (strstr(userBuf,argv[1])) 
         printf("%s\n",userBuf); 
     } 

} 

的程序被無限打印時,含有圖案行。我試過調試,但無法找出錯誤。請讓我知道我錯了,

感謝

+0

*「我試過調試」*不是很清楚。你嘗試了什麼?遍歷調試器中的代碼?插入推測的'printf'來探究發生了什麼? – dmckee

+0

是的。非常好。 – Kelly

回答

0

說出字符串爲「fooPATTERN」。你第一次通過循環,檢查「fooPATTERN」中的模式並找到它。然後你再次通過循環,檢查「ooPATTERN」中的模式並再次找到它。然後你第三次檢查「oPATTERN」中的模式並再次找到它。

既然你要這樣學習,我不會告訴你更多。你可以決定如何最好地解決它。至少有兩種根本不同的方式可以解決它。一種是在循環的每次傳遞中少做,以確保您只能找到一次。另一個是確保你的下一個循環通過任何已發現的模式。

有一件事要考慮:如果模式是'oo'而字符串是'ooo',應該找到多少個模式? 1或2?

0
  1. 「讀取」不會用空字符分隔數據。
  2. while循環應該encompase for循環 - 它沒有
0

首先,你不應該使用原始的Unix I/O與openread如果你只是學習C.開始與標準具有fopenfread/fscanf/fgets等的C i/o。其次,你將文件的連續片段讀入同一個緩衝區,每次覆蓋緩衝區,並且只處理緩衝區的最後一個內容。

第三,沒有什麼能保證當你用read()讀入緩衝區時,你的緩衝區將被零終止。事實上,它通常不會。

第四,你沒有在循環體中使用i變量。我無法確切地知道你在這裏拍攝的是什麼,但是在相同數據的情況下做同樣的事情10同樣的事情肯定不是它。第五,始終編譯可以遵守的最完整的警告設置 - 至少要用GCC編號爲-Wall。它應該抱怨說,你打電話read()不包括<unistd.h>

+0

對不明確的問題陳述。 ./a.out模式 我試圖打印出包含模式的文件「pattern.txt」中的行。 – Kelly