C代码问题:如何判断字符串含句号以区分实数与整数?
解决C语言判断数值字符串类型的问题
嘿,我看到你在写一个判断数值字符串是整数还是实数的C函数,代码只写了一半就卡壳啦!先别急,咱们紧扣你的需求:有效数值必须包含0-9的数字,有小数点就是实数,没有就是整数。我先帮你梳理常见的坑,再给你补全并修正代码~
你的代码可能存在的问题
- 只检查了第一个字符:数值字符串可能有正负号前缀、小数点在中间,必须遍历整个字符串才能判断。
- 缺少关键标记:你没定义变量记录是否找到数字、是否找到小数点,这两个是判断的核心依据。
- 没考虑合法性:比如多个小数点、只有小数点、包含非数字非小数点字符的情况,这些都属于无效数值。
修正后的完整代码
#include <stdio.h> #include <string.h> void typenumber(char *str) { int has_digit = 0; // 标记是否包含有效数字 int has_dot = 0; // 标记是否包含小数点 int i = 0; // 跳过开头的正负号(合法数值允许带正负前缀) if (str[i] == '+' || str[i] == '-') { i++; } // 遍历整个字符串逐一检查 while (str[i] != '\0') { // 遇到数字,标记存在有效数字 if (str[i] >= '0' && str[i] <= '9') { has_digit = 1; } // 遇到小数点,检查是否重复出现 else if (str[i] == '.') { if (has_dot) { // 多个小数点,直接判定无效 printf("\"%s\" 不是有效数值\n", str); return; } has_dot = 1; } // 遇到非数字非小数点的字符,直接判定无效 else { printf("\"%s\" 不是有效数值\n", str); return; } i++; } // 必须包含至少一个数字才是有效数值 if (!has_digit) { printf("\"%s\" 不是有效数值\n", str); return; } // 根据是否存在小数点判断类型 if (has_dot) { printf("\"%s\" 是实数\n", str); } else { printf("\"%s\" 是整数\n", str); } } // 测试用例,验证各种场景 int main() { typenumber("123"); // 整数 typenumber("123.45"); // 实数 typenumber(".45"); // 实数(合法的无前缀小数) typenumber("123."); // 实数(合法的无后缀小数) typenumber("-67.89"); // 带负号的实数 typenumber("+100"); // 带正号的整数 typenumber("12a3"); // 包含字母,无效 typenumber("..123"); // 多个小数点,无效 typenumber(""); // 空字符串,无效 typenumber("."); // 只有小数点,无效 return 0; }
代码关键逻辑说明
- 正负号处理:允许数值开头带
+或-,不影响类型判断,所以先跳过这些字符。 - 双标记判断:用
has_digit确保字符串是有效数值(至少有一个数字),用has_dot区分整数和实数。 - 非法情况拦截:遇到非数字非小数点、重复小数点时,直接返回无效,避免后续错误判断。
内容的提问来源于stack exchange,提问作者austin
相关产品推荐
相关产品推荐

