如何在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(®ex, "^-?[0-9]+/-?[0-9]+$", REG_EXTENDED); if (reg_status != 0) return 0; int match_status = regexec(®ex, str, 0, NULL, 0); regfree(®ex); 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
相关产品推荐
相关产品推荐

