该程序要求我从重定向文件(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;
}
我希望你们能在这方面有所启发。谢谢!
答案 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
}