c - 为什么 strlen ("TRLR") 会导致段错误?

标签 c parsing gdb

我有一个 C 语言程序正在解析文件。它适用于小文件,但是,当我使用较大的文件运行它并且到达我尝试获取其长度的“TRLR”字符串时,它会导致段错误。

int length = 0;
length = strlen(toParse);

在 gdb 中运行它,toParse 等于“TRLR”,即使在变量上运行 strlen 之后,长度也等于 0。

GDB 输出:

Breakpoint 1, initializeField (toParse=0x7fffffffe0e2 "TRLR")
    at ./src/GEDCOMutilities.c:79
79          printf("Before length = strlen(toParse\n");
(gdb) p toParse
$12 = 0x7ffffffffffe0e2 "TRLR"

编辑(显示信息来源的代码):

    fgets(buffer, 255, file);
    //Check if it's a number between 0-99
    if ((isdigit(buffer[0])) || (isdigit(buffer[0] && isdigit(buffer[1])))) {
        //Get the number and store into toParse
        toParse = strtok(buffer, " ");
        int num = atoi(toParse);

        //Create and initialize a new structure with the line's other information
        StructureToStoreInto* tempStructure = initialize(toParse);

本质上,我正在做的是从应该具有如下结构的文件中获取一行: 编号标签/引用值 因此,我检查以确保数字在 0-99(有效数字)之间,然后将行的其余部分发送到初始化函数中进行解析并存储到结构中。 (我知道正则表达式是一种更简单的验证方法)

最佳答案

文件中的最后一行可能没有换行符,因此第一次通过时对它们进行计数可能会减少一个(更少)。使用 fgets 的惯用方法是

while(fgets(buffer, 255, file) != NULL) { ... }

但我建议在开发过程中使用更大的缓冲区,以防止线路被分割。

关于c - 为什么 strlen ("TRLR") 会导致段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48548553/

相关文章:

parsing - Haskell:用二进制懒惰地读取二进制文件

ruby - ruby解析/静态代码分析框架

c - 这段C代码是什么意思?

python - 从 uWSGI 主循环调用 python 代码

C: sys/queue.h - 如何将指向 TAILQ_HEAD() 的指针传递给函数,而不是让 TAILQ_HEAD() 成为全局函数?

gdb - 让 GDB 每次都打印上下文

如果另一个指针持有相同的地址,我可以检查 Valgrind 或 Gdb 吗?

c - 我想构建一个具有整数输入的函数,将其输出存储到全局字符数组

Python - 如何使用 xml.etree.ElementTree 迭代每个 xml 节点返回列表?

c++ - gdb 中的递归 sizeof?