如何在 C89 中读取字符串直到逗号?

问题描述

我正在尝试使用 c89 读取 scanf 中的 CSV 文件

FOO,2,3
BAR,5,4
...

这是我尝试过的:

#include <stdio.h>

int main() {

    char code[10];
    double a,b;

    while( scanf("%s,%lf,%lf",code,&a,&b)!=EOF ) {
        printf("> %s\n",code);
        printf("> %s,%lf\n",a,b);
    }

    return 0;
}

这是我得到的输出

$ ./a.out
A,3
> A,3,0.000000,0.000000
B,4
> B,4,0.000000
$ 

这是我期望从上面的代码中得到的输出

$ ./a.out
A,3
> A
> A,2.000000,3.000000
B,4
> B
> B,5.000000,4.000000
$ 

编辑

根据我尝试过的评论

#include <stdio.h>

int main() {

    char code[10];
    double a,b;

    while( scanf("%9[^,],b);
    }

    return 0;
}

我得到:

$ cat > test.txt
A,3
B,5
C,6
$ cat test.txt | ./a.out 
> A
> A,3.000000
> 
B
> 
B,4.000000,5.000000
> 
C
> 
C,6.000000
> 

>,6.000000
$

显然第一条记录得到了正确处理,但随后的记录没有得到正确处理。

另外,我对 9 的作用以及整个 %9[^,] 是否是 c89 的一部分有疑问。

解决方法

我找到了一种解决方法,将每一行放入缓冲区并先用空格替换逗号,然后应用 %s

#include <stdio.h>

int main() {

    char line[256];    
    char code[10];
    double a,b;

    while(scanf("%s",line) != EOF) {

        /* REPLACE ALL,BY SPACES TO SIMPLIFY SCANF USAGE */
        char *p = line;
        while(*p!='\0') {
            if(*p==',') {
                *p = ' ';
            }
            p++;
        }


        sscanf(line,"%s %lf %lf",code,&a,&b);
        printf("> %s\n",code);
        printf("> %s,%lf,%lf\n",a,b);               
    }    

    return 0;   

}

不确定它是否是最优雅的解决方案,但提高了 scanf 部分的可读性。