2

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

./program substring < filetoreadfrom.data

我不断收到“Segmentation-fault (Core dumped)”错误消息,我不知道为什么。起初我以为这是因为没有分配我的 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;

}

我希望你们能对此有所了解。谢谢!

4

3 回答 3

2

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

例如

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

输出:

$ ./test < test.c
1
$
于 2013-08-29T11:59:22.367 回答
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以确保用户提供输入文件。

于 2013-08-29T12:38:54.193 回答
0

使用该命令行将argv[2]NULL. 所以这条线

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

会给出分段错误。

你可能想做

if(argc < 2) {
    //show usage
}
于 2013-08-29T11:59:16.063 回答