关于文本解析:strstr C函数运行异常

strstr C function is functioning abnormally

对于即将到来的C项目,目标是读取CSV文件,其中前两行列出行和列的长度,例如

1
2
3
4
5
6
attributes: 23
lines: 1000
e,x,y,n,t,l,f,c,b,p,e,r,s,y,w,w,p,w,o,p,n,y,p
e,b,y,y,t,l,f,c,b,n,e,c,s,s,w,w,p,w,o,p,n,s,m
e,x,f,y,t,l,f,w,n,w,t,b,s,s,w,w,p,w,o,p,n,v,d
e,s,f,g,f,n,f,c,n,k,e,e,s,s,w,w,p,w,o,p,k,v,u

问题是,我不知道将来的文件输入是否具有相同的行/列长度,因此我实现了determineFormat函数来读取前两行,这些行将用于构建数据结构。

为此,我需要将子字符串与当前行匹配。如果匹配,则使用fscanf读取行并提取长度整数。但是,此代码不起作用,因为整个strstr函数在ddd中被跳过。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
int lineCount, attrCount; //global variables

void determineFormats(FILE *incoming){

    char *curLine= emalloc(CLINPUT);
    int i;
    char *ptr=NULL;

    for (i=0; i<2; i++){
        if (fgets(curLine, CLINPUT, incoming) != NULL){
            ptr= strstr(curLine,"attrib");  //this line is skipped over

            if (ptr!= NULL)
                fscanf(incoming,"attributes: %d", &attrCount);

            else
                fscanf(incoming,"lines: %d", &lineCount);  

        }
    }

    printf("Attribute Count for the input file is: %d
"
, attrCount);
    printf("Line count is: %d
"
, lineCount);

}

我对if / else块的想法是,由于此功能只有两行,它们都位于文件的开头,因此只需扫描每一行并测试字符串是否匹配即可。如果是,则运行非空条件,否则执行另一个条件。但是,在这种情况下,strstr函数将被跳过。

额外信息

一些评论使我返回并仔细检查。

CLINPUT被定义为100,或者大约是每行要读取的字符数的40%。

当调用ptr= strstr(curLine,"attrib");时,这是ddd的输出:

1
2
3
0xb7eeaff0 in strstr () from /lib/libc.so.6
Single stepping until exit from function strstr,
which has no line number information.

一旦发生这种情况,线路指示器消失,并且从该点开始的单步执行(F5)返回到调用函数。


strstr运作良好。 问题是fscanf将读取下一行,因为当前已读取。

这是更正确的方法

1
2
3
4
5
6
7
8
9
10
for (i=0; i<2; i++){
    if (fgets(curLine, CLINPUT, incoming) != NULL){
        if (strstr(curLine,"attributes:")) {
            sscanf(curLine,"attributes: %d", &attrCount);
        } else if (strstr(curLine,"lines:")) {
            sscanf(curLine,"lines: %d", &lineCount);  
        }

    }
}