我用以下命令运行程序:
./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是指向未定义内存位置的指针。