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

如何使用sscanf检查含小数点、正负号的合法数字字符串

用sscanf验证带正负号和小数点的数字

我来帮你搞定这个需求!要使用sscanf检查字符串是否是合法数字(仅包含0-9、.、+、-),同时支持带小数点和正负号的格式,我们可以结合sscanf的格式匹配能力和额外的合法性检查来实现。

核心思路

  1. 利用sscanf的%lf格式符自动识别合法的浮点数格式(涵盖正负号、整数、小数场景)。
  2. 借助%n记录sscanf匹配到的字符长度,确保整个字符串都被匹配(没有多余的非法字符残留)。
  3. 额外做字符范围和边缘情况校验,比如限制小数点数量、符号位置,排除仅符号或仅小数点的无意义字符串。

完整代码示例

#include <stdio.h>
#include <stdbool.h>
#include <ctype.h>

bool is_valid_number(const char *str) {
    // 先排除空字符串或空指针的情况
    if (str == NULL || *str == '\0') {
        return false;
    }

    // 遍历检查所有字符是否在允许范围内,同时统计特殊字符数量
    int dot_count = 0;
    int sign_count = 0;
    for (int i = 0; str[i] != '\0'; i++) {
        char c = str[i];
        if (c == '.') {
            dot_count++;
            if (dot_count > 1) { // 最多只能有一个小数点
                return false;
            }
        } else if (c == '+' || c == '-') {
            sign_count++;
            // 符号只能在开头,且最多出现一次
            if (sign_count > 1 || i != 0) {
                return false;
            }
        } else if (!isdigit(c)) { // 非数字且非允许的符号,直接判定非法
            return false;
        }
    }

    // 排除仅符号或仅小数点的无效情况
    if ((sign_count == 1 && str[1] == '\0') || (dot_count == 1 && str[0] == '.' && str[1] == '\0')) {
        return false;
    }

    // 用sscanf匹配数字格式,确保是合法数值且无多余字符
    int matched_len;
    double num;
    if (sscanf(str, "%lf%n", &num, &matched_len) == 1 && str[matched_len] == '\0') {
        return true;
    }

    return false;
}

// 测试用例
int main() {
    const char *test_cases[] = {
        "123", "-456", "+789", "12.34", "-56.78", "+90.12",
        ".123", "456.", "-.789", "+123.",
        "12.3.4", "+-123", "12a3", " 123", "", "+", ".", NULL
    };

    for (int i = 0; test_cases[i] != NULL; i++) {
        const char *str = test_cases[i];
        printf("\"%s\" -> %s\n", str, is_valid_number(str) ? "合法" : "非法");
    }

    return 0;
}

关键细节解释

  • 字符范围校验:循环遍历每个字符,严格限制仅允许0-9、.、+、-,同时确保小数点最多1个、符号只能在开头。
  • 边缘情况排除:避免了仅+、-或.这类无意义的字符串被误判为合法数字。
  • sscanf匹配逻辑:%lf会自动处理所有合法的浮点数格式(包括整数、小数、带符号的情况),%n记录匹配的字符数,保证整个字符串都被合法匹配,没有多余字符残留。

可选的严格模式调整

如果你的需求不允许.123或123.这种格式(要求小数点前后必须有数字),可以在字符检查部分添加额外判断:比如小数点的前一位或后一位必须是数字。

内容的提问来源于stack exchange,提问作者user873101

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:51:20