C语言如何从输入读取任意数量浮点数并将逗号识别为小数分隔符
你碰到的问题根源是C语言默认的C区域设置(locale)仅识别半角句号.作为小数点,当读取到,时会判定浮点数读取结束,将,赋值给后面的spacing变量,因此把1,3拆成了两个独立的输入值,导致列数计算错误。不需要引入正则表达式实现需求,用以下两种方案即可解决:
方案1:修改全局区域设置(最简单)
- 引入本地化头文件:在代码开头添加
#include <locale.h> - 在程序初始化阶段(如
main函数最开头)添加区域设置代码:// 类Unix系统使用以下代码,切换为德语区域(默认用逗号作为小数点) setlocale(LC_NUMERIC, "de_DE.UTF-8"); // Windows系统可替换为:setlocale(LC_NUMERIC, "German"); - 原有
scanf("%f%c", &number, &spacing);代码不需要修改,此时%f会自动将,识别为小数点,不会提前截断输入。
方案2:手动转换字符(兼容性最优,不影响全局逻辑)
如果不想修改全局区域设置避免影响其他功能,可先读取数字字符串替换逗号后再转成浮点数,修改后的createRow函数如下:
#include <stdlib.h> #include <string.h> Row *createRow(int rowNum) { Row *newRow = mallocRow(rowNum); float number = 0.0; int col = 0; char spacing = ' '; char num_buf[32]; // 存储单个数的字符串,长度足够覆盖浮点数范围 do { // %[^\n ]表示读取到换行或空格就停止,不会把逗号当成分隔符 scanf("%31[^\n ]%c", num_buf, &spacing); // 把字符串中的逗号替换成点 for (int i = 0; num_buf[i]; i++) { if (num_buf[i] == ',') { num_buf[i] = '.'; break; } } // 转换为浮点数 number = atof(num_buf); if (number != 0.0) { appendNode( newRow, createNode(newRow->row, col, number) ); } else { newRow->size++; } col++; } while (spacing != '\n'); return newRow; }
这个方案不依赖系统的区域配置,跨平台兼容性更好,也不会修改全局设置影响其他模块的逻辑。
内容的提问来源于stack exchange,提问作者João Pedro Martins de Paula
相关产品推荐
相关产品推荐

