c 使用 fgets、strtok 读取文件导致段错误

标签 c io segmentation-fault fgets strtok

尝试逐行读取文件, 文件中的一行如下所示:

InputVector:0(1,3,4,2,40)

代码:

FILE *file = fopen(filename, "r");
char buff[26];
char *token;

while(fgets(buff, 26, (FILE*)file) != NULL) {

    buff[strlen(buff)] = '\0';

    printf("%s\n", buff);
    token = strtok(buff, INV_DELIM1);
    printf("%s\n", token);
    token = strtok(NULL, INV_DELIM2);
    printf("%s\n", token);

    while(token != NULL) {
        token = strtok(NULL, INV_DELIM3);
        printf("%s\n", token);
    }
}

我的猜测是,在 while 循环中 strtok() 在最后一个数字之后没有返回 NULL 并继续运行并导致段错误。我尝试在 fgets() 之后将 "\0" 添加到 buff 的末尾,但没有执行任何操作。

delim1: ":",
delim2: "(",
delim3: ",)"

我得到的输出是

InputVector:0(1,3,4,2,40)
InputVector
0
1
3
4
2
40
segfault

最佳答案

您反复使用如下代码:

token = strtok(NULL, INV_DELIM2);
printf("%s\n", token);

如果strtok()返回 NULL,然后将其传递给 printf() ,由于 %s ,它期望获得一个指向有效的以 0 结尾的字符串的指针。在格式参数中。 NULL 不是指向有效的以 0 结尾的字符串的指针,因此会发生不好的事情,在您的情况下表现为崩溃。

解决方案:确保strtok()返回的指针在尝试使用它之前不为 NULL。

对 future 的建议:了解如何使用调试器单步执行代码,并习惯使用valgrind来帮助跟踪内存问题。当您可以使用工具找出问题所在并准确了解问题所在时,您不必对发生的情况做出错误的猜测。

关于c 使用 fgets、strtok 读取文件导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52289809/

相关文章:

c++ - 如何理解和修复这段代码中的段错误?

互斥锁指针在锁定状态期间可以改变吗?

java - 如何在java中对 "\"进行字符串分割?

java - 从android中的Socket读取数据

c++ - 由于无效写入导致的段错误

c++ - BingoBoard 分段故障

c - C语言中一个字符替换为两个字符

c++ - 将 C++ 集成到 C 基础架构中

c - 从 C 函数返回字符串

java - java递归将一个单词分成三个或更多单词