C语言:如何检查输入文件中的数据是否为合法数字
嘿,这个问题我做类似大学项目的时候也碰到过,isdigit()确实不太适用——它只能识别0-9的纯数字字符,完全没法处理正负号和小数点这类合法符号。下面给你几个实用的解决方案,你可以根据自己的需求来选:
方法1:尝试转换法(简单粗暴,适合快速实现)
这个思路很直接:把读取到的每一行字符串尝试转换成浮点数,如果转换失败,就说明这行不是合法数字。这种方法不用自己纠结各种数字格式的细节,Python里的示例代码如下:
def is_valid_number(s): try: # 用float转换可以兼容整数、带小数的数字,甚至科学计数法(如果允许的话) float(s) return True except ValueError: # 转换失败,说明不是合法数字 return False # 读取文件并逐行校验 with open('input.txt', 'r') as file: for line_num, line in enumerate(file, 1): cleaned_line = line.strip() # 可以根据需求决定是否允许空行,这里跳过空行 if not cleaned_line: continue if not is_valid_number(cleaned_line): print(f"Error: 第{line_num}行 '{cleaned_line}' 不是合法数字")
优点:代码简洁,不用自己处理复杂的格式规则,甚至能自动识别1e3这类科学计数法的数字;
缺点:如果你的项目不允许科学计数法,这个方法会误判,需要额外过滤这种情况。
方法2:正则表达式匹配(精确控制格式)
如果需要严格限定数字格式(比如禁止科学计数法、只允许123、-123.45、+0.24这类标准格式),正则表达式是最佳选择。下面是一个通用的正则匹配规则:
import re # 定义匹配规则:只允许正负号开头,整数或带小数点的小数 number_pattern = r'^[+-]?(\d+(\.\d*)?|\.\d+)$' # 规则解释: # ^ 和 $ 确保整行都是数字,没有多余字符 # [+-]? 允许开头有可选的正负号 # (\d+(\.\d*)?|\.\d+) 匹配两种合法情况: # 1. 整数+可选小数点(比如123、123.) # 2. 小数点+数字(比如.24) def is_valid_number(s): # 用fullmatch确保整个字符串完全匹配规则 return re.fullmatch(number_pattern, s.strip()) is not None # 读取校验逻辑和方法1一致 with open('input.txt', 'r') as file: for line_num, line in enumerate(file, 1): cleaned_line = line.strip() if not cleaned_line: continue if not is_valid_number(cleaned_line): print(f"Error: 第{line_num}行 '{cleaned_line}' 格式非法")
优点:可以精确控制允许的格式,比如你想禁止.24或123.这种不完整的小数,只需要调整正则规则即可;
缺点:需要了解基础的正则语法,但上面的规则已经覆盖了绝大多数合法数字场景,直接用也没问题。
方法3:手动逐字符校验(适合学习理解)
如果你的项目更偏向于学习数字格式的校验逻辑,手动遍历每个字符检查也是个好方法,能帮你彻底搞清楚数字的合法组成:
def is_valid_number(s): s = s.strip() if not s: return False index = 0 # 处理开头的正负号 if s[index] in '+-': index += 1 # 如果只有正负号,没有后续数字,直接非法 if index >= len(s): return False has_digit = False has_decimal = False while index < len(s): char = s[index] if char.isdigit(): has_digit = True elif char == '.': # 已经有一个小数点了,不能再出现 if has_decimal: return False has_decimal = True else: # 出现了非数字、非小数点的字符,非法 return False index += 1 # 至少要有一个数字(不能只有正负号+小数点,比如"+."是非法的) return has_digit # 读取校验逻辑同上
优点:完全自定义逻辑,适合学习数字格式的校验规则;
缺点:代码量相对多,容易遗漏边界情况(比如忘记处理只有正负号的场景)。
内容的提问来源于stack exchange,提问作者RoyM
相关产品推荐
相关产品推荐

