我正在尝试使用C程序模拟UNIX的grep 模式(仅用于学习)。我写的代码给了我一个运行时错误..
#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 :(得分:0)
说字符串是“fooPATTERN”。你第一次通过循环,检查“fooPATTERN”中的模式并找到它。然后你第二次循环,你检查“ooPATTERN”中的模式,然后再找到它。然后你第三次检查“oPATTERN”中的模式并再次找到它。
既然你要这样学习,我不会告诉你更多。您可以决定如何最好地解决它。至少有两种根本不同的方法可以解决它。一个是在循环的每次传递中做的更少,以确保您只找到一次。另一种方法是确保循环的下一次传递超过了找到的任何模式。
要考虑的一件事:如果模式是'oo'而字符串是'ooo',那么应该找到多少个模式? 1还是2?
答案 1 :(得分:0)
答案 2 :(得分:0)
首先,如果您刚刚学习C,则不应该将原始Unix i / o与open
和read
一起使用。从标准C i / o开始使用fopen
和fread
/ fscanf
/ fgets
等等。
其次,你将文件的连续部分读入同一缓冲区,每次都覆盖缓冲区,并且只处理缓冲区的最后内容。
第三,当您使用read()
读取缓冲区时,没有任何保证您的缓冲区将被终止。事实上,它通常不会。
第四,你没有在循环体中使用i
变量。我无法确切地说出你在这里拍摄的是什么,但在同样的数据上做同样的事情肯定不是一千次。
第五,始终使用您可以遵守的最完整警告设置进行编译 - 至少-Wall
使用GCC。它应该抱怨您在不包含read()
的情况下致电<unistd.h>
。