为什么在C中使用fgets时出现分段错误



我用以下命令运行程序:

./word_search oi < text.txt

运行时出现分段错误

该程序旨在查找文件中单词(作为命令行arg给出(的位置,并打印出这些行。

#include <stdio.h>
#include "substring.c"
int main(int argc, char ** argv) {
if(argc == 2) {
char *str;
while(fgets(str, 100, stdin)) {
if(substring(str, argv[1]) != -1) {
printf("Found: %s", str);
}
}
}
return 0;
}

如果我将char *str更改为char str[100],那么它运行得非常好。有人能告诉我为什么吗
substring.c:中的内容

#include <stdio.h>
#include <string.h>
int substring(const char *line, const char *substr) {
int i, j;
int result;
for(i = 0; i <= strlen(line)-strlen(substr); i++) {
result = 0;
if(line[i] == substr[0]) {
int c = i;
for(j = 0; j < strlen(substr); j++) {
if (line[c] != substr[j]) {
result = -1;
}
c++;
}
if(result != -1)
return i;
}
}
return -1;
}

test.txt中的内容只是几行毫无意义的字符。

char *str是一个统一的指针,它不能容纳您试图复制到其中的字符串,也不能为它分配内存:

#include <stdlib.h>
#define SIZE 100
char *str = malloc(SIZE); //char has the size of 1 across platforms

或者简单地用你需要的尺寸声明:

char str[SIZE];

将str的大小传递给fgets

while(fgets(str, SIZE, stdin))

fgets:

  • 您的容器将以null结尾,它只能容纳一个SIZE - 1字符的字符串
  • SIZE - 1以上的所有字符(包括'n'(都将保持未读状态,因此在缓冲区中,您可能需要清除它

我建议你花点时间学习基本的C。尤其是阅读指针,一开始很难理解。

在您的示例中,str是指向未定义内存位置的指针。

相关内容

  • 没有找到相关文章

最新更新