0
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include <sys/types.h> 
#include <sys/stat.h>
#include <unistd.h>
#include<string.h>
#include <fcntl.h>

void match_pattern(char *argv[])
{
    int fd,r,j=0;
    char temp,line[100];
    if((fd=open(argv[2],O_RDONLY)) != -1)
    {
        while((r=read(fd,&temp,sizeof(char)))!= 0)
        {
            if(temp!='\n')
            {
                line[j]=temp;
                j++;
            }
            else
            {
                if(strstr(line,argv[1])!=NULL)
                    printf("%s\n",line);
                memset(line,0,sizeof(line));
                j=0;
            }

        }
    }   
}

main(int argc,char *argv[])
{
    struct stat stt;
    if(argc==3)
    {
        if(stat(argv[2],&stt)==0)
            match_pattern(argv);
        else 
        {
            perror("stat()");
            exit(1);
        }
    }
}

文件内容:

arunds ghh
sdf
hi
hello dude
am arun

我的输出:

./mygrep arun file
arunds ghh
am arun

我得到正确的输出

文件内容:

arun arundfdf arun
arunds ghh
sdf

我的输出:

./mygrep arun file
arun arundfdf arun �5
arunds ghh

我不知道为什么会打印一些不需要的字符。

4

2 回答 2

2

你永远不会 NULL 终止你的line缓冲区,所以它会在结束后溢出。在声明变量memset后也运行调用。line

于 2013-02-05T15:13:24.450 回答
0

您需要空终止,line但为什么一次读取一个字符?您可以读取整行,fgets()这些行将为您终止缓冲区:

while (fgets(line, sizeof(line), file)) {
   if (strstr(line, argv[1])) {
    ...
   }
}

这也将确保您不会溢出您分配的 100 字节缓冲区。

于 2013-02-05T15:19:43.790 回答