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

时间:2018-01-31 17:55:43

标签: c parsing gdb

我在C中有一个解析文件的程序。它适用于一个小文件,但是,当我用一个更大的文件运行它时,我达到一个" TRLR"我尝试获取长度的字符串,它会导致段错误。

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

在gdb中运行它,toParse等于" TRLR",即使在对变量运行strlen之后,length也等于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(有效数字)之间,然后我将该行的其余部分发送到我的初始化函数中以进行解析并存储到结构中。 (我知道正则表达式是一种更简单的验证方法)

1 个答案:

答案 0 :(得分:1)

文件中的最后一行可能没有换行符,因此用第一遍计算它们可以减一(少)。使用fgets的惯用方法是

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

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