【发布时间】:2018-04-09 19:28:14
【问题描述】:
作为练习的一部分,我正在用 C 语言开发一个类似 grep 的小程序,它应该接收一个字符串和一些文件名,以便在引用的文件中查找该字符串。
我通过硬编码文件名和字符串来实现它:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int searchString(char *str1, char *str2) {
if (strstr(str1, str2) == NULL) {
return 0;
} else {
return 1;
}
}
void searchInFile(char *filename, char *str) {
FILE *f;
int lineno =0;
size_t len;
char *buffer;
f = fopen(filename, "r");
if (f != NULL) {
while (getline(&buffer, &len, f) != -1) {
lineno++;
if (searchString(buffer, str)) {
printf("[%s:%d] %s", filename, lineno, buffer);
}
}
}
fclose(f);
}
int main() {
searchInFile("loremipsum.txt", "dolor");
return 0;
}
但只要我修改代码以更改 int main() 行以添加 argc 和 argv,编译它然后运行它,脚本返回一个错误信息。 修改为:
int main(int argc, char *argv[]) {
searchInFile("loremipsum.txt", "dolor");
return 0;
}
收到的错误:
* `./a.out' 中的错误:realloc():无效指针:0x000056424999394d *
有人知道我为什么会收到这个错误吗?
【问题讨论】:
-
是的,你永远不会为缓冲区分配内存,所以你的代码可能会做任何事情。
-
man 3 getline,ssize_t getline(char **lineptr, size_t *n, FILE *stream);"如果*lineptr设置为NULL并且*n在调用前设置0,那么getline()将分配一个缓冲区用于存储该行。" 此外,您应该在main()中打开并验证f,然后将FILE*参数传递给searchInFile而不是char *。 -
buffer 也没有设置为 NULL。
-
我习惯了 Python 等更简单的语言,现在我的 C 语言有点生疏了。一旦我将缓冲区设置为 NULL 并将 len 设置为 0,代码就会再次运行。谢谢!关于在 main 中打开文件,练习为我们提供了函数原型,因此我需要接收文件名作为参数。
-
当然。给我几分钟,我很乐意效劳。