2011-08-14 73 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