含strncmp的条件语句无法执行问题求助
问题分析与修复方案
兄弟,你的这个循环逻辑失效的核心原因,是对strncmp的返回值理解错了,而且用算术相加的方式判断“是否都不匹配”完全是个逻辑陷阱。
为啥你的写法会出问题?
先回忆下strncmp的返回规则:
- 当两个字符串的前n个字符完全匹配时,返回0
- 不匹配时,返回正数或负数(取决于字符的ASCII差值)
你原本的思路是“三个strncmp结果相加等于0,就代表三个都不匹配”——这完全站不住脚:
- 比如如果输入匹配了
KELVIN(第一个strncmp返回0),另外两个返回1和-1,加起来刚好是0,这时候你的循环会认为“输入无效”继续执行,但实际上这是合法输入,不该循环; - 反过来,如果三个都不匹配,返回2、3、-4,加起来是1≠0,循环直接退出,明明输入无效却没触发重新输入。
这就导致你的逻辑完全和预期相反,或者随机失效。
正确的写法应该这么写
你真正要实现的逻辑是:当当前温度单位不是三个指定值中的任何一个,并且要转换的目标单位也不是三个指定值中的任何一个时,继续循环让用户重新输入。
用逻辑运算符直接判断,别搞算术相加那套:
} while ( // 检查当前温度单位是否不在合法列表里 (strncmp(temp_data.current_temp, KELVIN, strlen(temp_data.current_temp)) != 0 && strncmp(temp_data.current_temp, CELSIUS, strlen(temp_data.current_temp)) != 0 && strncmp(temp_data.current_temp, FAHRENHEIT, strlen(temp_data.current_temp)) != 0) && // 检查转换目标单位是否不在合法列表里 (strncmp(local_convert_temp, KELVIN, strlen(local_convert_temp)) != 0 && strncmp(local_convert_temp, CELSIUS, strlen(local_convert_temp)) != 0 && strncmp(local_convert_temp, FAHRENHEIT, strlen(local_convert_temp)) != 0) );
额外的优化建议
- 如果你是想精确匹配整个字符串,建议用
strcmp代替strncmp,因为strncmp的第三个参数如果是输入字符串的长度,可能会出现“部分匹配误判”的情况(比如输入"K",strncmp("K", "KELVIN", 1)会返回0,被误判为合法单位)。 - 把“判断单位是否合法”的逻辑封装成函数,代码会更清晰,也不容易写错:
然后循环条件可以简化成:bool is_valid_temp_unit(const char* unit) { return strcmp(unit, KELVIN) == 0 || strcmp(unit, CELSIUS) == 0 || strcmp(unit, FAHRENHEIT) == 0; }
这样一眼就能看懂逻辑,也不会再犯类似的错误。} while (!is_valid_temp_unit(temp_data.current_temp) && !is_valid_temp_unit(local_convert_temp));
内容的提问来源于stack exchange,提问作者Okino Kamali Leiba
相关产品推荐
相关产品推荐

