3

我讨厌成为那个问简单问题的人,但我的 C 语言有点生疏,这里有一些东西在躲避我。我正在尝试使用以下示例文本读取文件:

    23# 1110.00:1000.00,120.00:1110.00,1190.00:900.00,-52.98,-53.21

我想将除以基数和昏迷的元素分成几个字符串,但是在我的控制台中根本没有得到任何输出。

    #include <stdio.h>   /* required for file operations */
    #include <conio.h>  /* for clrscr */
    #include <dos.h>  /* for delay */

    FILE *fr;            /* declare the file pointer */

    #include <stdio.h>
    int main(void)
    {
        char output[200];
        const char filename[] = "file.txt";
        FILE *file = fopen(filename, "r");
        if ( file )
        {
            char line [ BUFSIZ ];
            while ( fgets(line, sizeof line, file) )
            { printf(" %s \n", line);

                char * i[80],pt1[80], pt2[80], pt3[80], tp1[80], tp2[80];
                if ( sscanf(line, "%s# %s,%s,%s,%s,%s",
                        &i, &pt1, &pt2, &pt3, &tp1, &tp2) == 6 )
                {
                    snprintf(output, sizeof output,
                            "Leitura:=%s,PT1=%s,PT2=%s,PT3=%s,TP1=%s,TP2=%s,",
                            i, pt1, pt2, pt3, tp1, tp2);
                    puts(output);
                }
            }
        }
        else
        {
            perror(filename);
        }
        return 0;
    }
4

1 回答 1

6

问题是sscanf()不会将其视为#,作为分隔符,只有空格。这意味着"%s"它将完全读取"1110.00:1000.00,120.00:1110.00,1190.00:900.00,-52.98,-53.21",导致可能的缓冲区溢出并且绝对6不是结果。

一个解决方案是使用扫描集:

if (sscanf(line,
           "%79[^#]# %79[^,],%79[^,],%79[^,],%79[^,],%s",
           i,
           pt1,
           pt2,
           pt3,
           tp1,
           tp2) == 6 )

此外,声明i不正确:

char * i[80],pt1[80], pt2[80], pt3[80], tp1[80], tp2[80];

因为它制作i了一个 80 的数组char*。改成:

char i[80],pt1[80], pt2[80], pt3[80], tp1[80], tp2[80];
于 2013-04-17T11:09:15.867 回答