c - 如何在 C89 中读取字符串直到逗号?
问题描述
我正在尝试c89
使用以下方式读取 CSV 文件scanf
:
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,%lf\n", code, a, b);
}
return 0;
}
这是我得到的输出:
$ ./a.out
A,2,3
> A,2,3
> A,2,3,0.000000,0.000000
B,5,4
> B,5,4
> B,5,4,0.000000,0.000000
$
这是我对上述代码的期望输出:
$ ./a.out
A,2,3
> A
> A,2.000000,3.000000
B,5,4
> B
> B,5.000000,4.000000
$
编辑
根据提供的评论,我尝试过:
#include <stdio.h>
int main() {
char code[10];
double a,b;
while( scanf("%9[^,],%lf,%lf", code, &a, &b)!=EOF ) {
printf("> %s\n", code);
printf("> %s,%lf,%lf\n", code, a, b);
}
return 0;
}
我得到:
$ cat > test.txt
A,2,3
B,4,5
C,5,6
$ cat test.txt | ./a.out
> A
> A,2.000000,3.000000
>
B
>
B,4.000000,5.000000
>
C
>
C,5.000000,6.000000
>
>
,5.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", code, a, b);
}
return 0;
}
不确定它是否是最优雅的解决方案,但提高了 scanf 部分的可读性。
推荐阅读
- reactjs - reactjs 没有从 index.css 中获取样式
- azure-aks - 具有虚拟节点和自动缩放功能的 Azure Kubernetes - 这可能吗?
- java - 返回方程 x1 + x2 + x3 = num 的解数
- ms-access-2013 - 如何将字段数据打印到 A4 纸的特定区域?
- css - 引导滑块文本覆盖正在禁用导航链接
- xpath - 如何使用 importXML 从网站将数据导入我的 Google 表格
- php - 有没有办法使用存储在数据库中的信息来确定用户在登录时被发送到哪个网页?
- wordpress - 如何让用户评论仅在登录时显示
- r - 将 CSV 导入 R - 数值读取为整数
- python - 如何从数据框中切片唯一日期数据?