You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 01:54:07