字符串字符查找函数charfind始终返回-1的问题排查求助
问题排查:字符查找函数始终返回-1的原因
先看你的函数代码:
int charfind(char* str, char c, int start) { int index = -1; for (size_t i = start; i <= strlen(str); i++) { if (str[i] == c) { index = i; break; } } return index; }
核心问题分析
- 循环边界错误:
strlen(str)返回字符串的有效字符长度(不含末尾的'\0'),你用i <= strlen(str)会让循环最后访问str[strlen(str)](即'\0')。更关键的是,如果start值大于等于字符串长度,循环直接从有效字符范围外开始,根本遍历不到目标字符。 - 类型不匹配导致比较失败:当你修改参数为
unsigned char或int时,若你的编译器中char是有符号类型,传入大于127的字符值(比如扩展ASCII字符)会触发符号扩展:char类型的255会被解析为-1,而unsigned char或int类型的255保持原值,此时str[i] == c会变成-1 == 255,结果必然为假。
修复方案
方案1:仅查找字符串内的有效字符
#include <string.h> int charfind(char* str, int c, int start) { int index = -1; size_t len = strlen(str); // 先判断start是否越界 if (start < 0 || (size_t)start >= len) { return index; } for (size_t i = (size_t)start; i < len; i++) { // 统一转为unsigned char比较,避免符号扩展问题 if ((unsigned char)str[i] == (unsigned char)c) { index = (int)i; break; } } return index; }
方案2:支持查找字符串结束符'\0'
如果需要查找'\0',可保留i <= len,但要调整越界判断:
#include <string.h> int charfind(char* str, int c, int start) { int index = -1; size_t len = strlen(str); if (start < 0 || (size_t)start > len) { return index; } for (size_t i = (size_t)start; i <= len; i++) { if ((unsigned char)str[i] == (unsigned char)c) { index = (int)i; break; } } return index; }
关键修改点
- 提前计算
strlen(str),避免循环中重复调用(每次调用都会遍历字符串,影响性能)。 - 先校验
start的合法性,直接排除越界场景。 - 统一转换为
unsigned char进行比较,彻底解决有符号/无符号类型不匹配的问题,不管传入字符字面量还是ASCII数值都能正确匹配。
测试建议
- 测试时传入合法的
start值(0到字符串长度-1之间)。 - 测试扩展ASCII字符时,可直接传入数值(如255)或
(unsigned char)255,验证函数是否能正确匹配。
内容的提问来源于stack exchange,提问作者mlb0066
相关产品推荐
相关产品推荐

