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

如何在C语言中检查输入字符串是否符合指定格式?

检查字符串是否符合"%d/%d"格式的几种实现方法

针对你需要验证字符串是否为「整数/整数」格式(无多余字符)的需求,以及Windows下使用regex.h遇到的问题,这里提供几种可行方案:

方法1:手动字符串解析(跨平台,无依赖)

无需正则库,直接通过字符遍历验证格式,兼容性最好,适合严格控制匹配规则的场景:

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

int check_dslashd_format(const char *str) {
    if (!str || *str == '\0') return 0;

    const char *p = str;
    // 可选:允许正负号,不需要可删除这段
    if (*p == '+' || *p == '-') {
        p++;
        if (!isdigit((unsigned char)*p)) return 0;
    }
    // 匹配前面的数字
    while (isdigit((unsigned char)*p)) p++;

    // 检查中间的'/',不能在开头或结尾
    if (*p != '/' || *(p+1) == '\0') return 0;
    p++;

    // 可选:允许后面数字带正负号,不需要可删除这段
    if (*p == '+' || *p == '-') {
        p++;
        if (!isdigit((unsigned char)*p)) return 0;
    }
    // 匹配后面的数字
    while (isdigit((unsigned char)*p)) p++;

    // 确保无多余字符
    return *p == '\0' ? 1 : 0;
}

// 测试示例
int main() {
    printf("%d\n", check_dslashd_format("3/5"));    // 输出1
    printf("%d\n", check_dslashd_format("3/5f"));   // 输出0
    printf("%d\n", check_dslashd_format("-123/45"));// 输出1
    printf("%d\n", check_dslashd_format("/5"));      // 输出0
    return 0;
}

方法2:用sscanf快速验证(轻量简洁)

利用标准库的sscanf,通过检查返回值和是否有剩余字符来判断是否完全匹配:

#include <stdio.h>

int check_dslashd_format(const char *str) {
    int num1, num2;
    char extra;
    // %d/%d匹配整数对,%c捕获剩余字符,若完全匹配则不会读取到extra
    int match_count = sscanf(str, "%d/%d%c", &num1, &num2, &extra);
    // 返回值为2说明两个整数都被成功读取,且无多余字符
    return match_count == 2 ? 1 : 0;
}

// 测试
int main() {
    printf("%d\n", check_dslashd_format("3/5"));    //1
    printf("%d\n", check_dslashd_format("3/5f"));   //0
    printf("%d\n", check_dslashd_format("123/456"));//1
    printf("%d\n", check_dslashd_format("3/"));     //0
    return 0;
}

注意:sscanf会忽略字符串开头的空白字符,如果需要严格禁止空白,可先遍历字符串检查是否有空格、制表符等。

方法3:解决Windows下正则使用问题

如果坚持要用正则,分两种情况处理:

情况A:使用MinGW编译器

MinGW支持POSIX标准的regex.h,直接编写正则匹配代码即可:

#include <stdio.h>
#include <regex.h>

int check_dslashd_format(const char *str) {
    regex_t regex;
    // 正则^-?\d+/-?\d+$确保整个字符串是「可选正负号+数字/可选正负号+数字」的格式
    int reg_status = regcomp(&regex, "^-?[0-9]+/-?[0-9]+$", REG_EXTENDED);
    if (reg_status != 0) return 0;
    int match_status = regexec(&regex, str, 0, NULL, 0);
    regfree(&regex);
    return match_status == 0 ? 1 : 0;
}

int main() {
    printf("%d\n", check_dslashd_format("3/5"));    //1
    printf("%d\n", check_dslashd_format("3/5f"));   //0
    return 0;
}

情况B:使用MSVC编译器

MSVC没有内置POSIX正则库,可改用C的<regex>(若项目允许使用C):

#include <iostream>
#include <regex>
#include <string>

int check_dslashd_format(const std::string &str) {
    std::regex pattern(R"(^-?\d+/-?\d+$)");
    return std::regex_match(str, pattern) ? 1 : 0;
}

int main() {
    std::cout << check_dslashd_format("3/5") << std::endl;    //1
    std::cout << check_dslashd_format("3/5f") << std::endl;   //0
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

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