从重定向文件中查找包含子字符串的字符串,但不断收到Seg-fault?

时间:2013-08-29 11:49:28

标签: c segmentation-fault malloc substring strstr

该程序要求我从重定向文件(filetoreadfrom.data)中查找包含子串(在命令行参数中指定)的字符串。该文件包含单词(字符串)列表。如果字符串包含子字符串,则打印字符串。命令行如下:

  

./ program substring< filetoreadfrom.data

我一直收到“Segmentation-fault(Core dumped)”错误消息,我不知道为什么。起初我以为这是因为没有malloc'ing我的char数组,但现在我已经通过使用 #define MAXchar 200 修复char数组的大小来摆脱它,我真的可以'看看出了什么问题。是因为内存空间,我对fgets或strstr的使用,还是我重定向文件的方式有问题。

这些是我的代码:

    char line[MAXchar]; //MAXchar = 200
    int count=0;

    //check usage
    if ((strcmp("<", argv[2]))!=0){
            fprintf(stderr,"Usage: ./program substring\n");
            return 1;
    }

    //read lines from redirected file
    while (fgets(line,MAXchar,stdin)!=NULL){
            //find substring in each line
            //if substring is present in the line
            if (strstr(line,argv[1])!=NULL){
                    //print the line
                    fprintf(stdout, "%s\n", line);
                    count=1;
            }
    }
    //if none of the line contains the substring
    if (count==0){
            fprintf(stdout, "No match found\n");
    }

    return 0;

}

我希望你们能在这方面有所启发。谢谢!

3 个答案:

答案 0 :(得分:2)

检查argv[2]时崩溃了。没有argv[2],因为<是一个特定于控制台/ shell的命令,它不会传递给您的程序。在你检查argv [2]时它是一个NULL指针,你没有在那里写/读的权限。这就是发生段错误的原因。

e.g。

#include <stdio.h>
int main(int argc, char** argv)
{
  printf("%d\n", argc);
  return 0;
}

输出:

$ ./test < test.c
1
$

答案 1 :(得分:1)

< filetoreadfrom.data表示将filetoreadfrom.data用作stdin

所以你的程序只有两个参数:./program substring

在您的代码中,删除此部分:

if ((strcmp("<", argv[2]))!=0){
            fprintf(stderr,"Usage: ./program substring\n");
            return 1;
    }

如果您想知道用户忘记使用< filetoreadfrom.data,您可以通过filetoreadfrom.data通过./program substring filetoreadfrom.data并打开它,

然后使用dup将文件说明复制到STDIN_FILENO。或者只是从中读取。

您可以查看argc != 3以确保用户提供输入文件。

答案 2 :(得分:0)

使用该命令行argv[2]将为NULL。这一行

if ((strcmp("<", argv[2]))!=0){

会给出分段错误。

您可能想要

if(argc < 2) {
    //show usage
}