**已关闭。**此问题需要debugging details。它目前不接受回答。
编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将帮助其他人回答这个问题。
17天前关闭
Improve this question
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;
}
我尝试将参数改为unsigned chars和int,并尝试同时提供字符字面量和非符号字符的数字,但它总是返回-1。
在我看来,这似乎表明if语句的计算结果永远不会为true。
3条答案
按热度按时间irlmq6kh1#
你还没有展示如何使用这个功能。如果调用者行为良好,没有传递垃圾值,那么您所编写的应该可以工作。
为了您的利益,这里有另一种选择:
注意,第三个参数现在是
size_t
类型。对于初学者来说,传递内存地址并允许负偏移的可能性是不明智的。jecbmhm32#
我正在尝试创建一个函数来在C中查找字符串中的字符。我做错了什么?
测试良好,直到
<= strlen()
这就是
strchr()
所做的。“终止空字符被认为是字符串的一部分."。这允许charfind(s, '\0', 0)
返回非1结果。比对类型错误
str...()
的功能就像字符是unsigned char
一样,即使char
是 * 有符号的 *。在这里推荐同样的。接口过于复杂
int charfind(char* str, char c, int start)
没有什么意义,因为调用者可以使用charfind(str + start, c)
调用int
与size_t
索引字符串长度可以超过
INT_MAX
。size_t
是字符串索引的最佳类型。以
long charfind(char* str, char c, size_t start) {
为例。然而,如果删除不需要的
start
参数,这就没有意义了。返回值
而不是
int
,考虑返回一个指向定位位置的指针,如果找不到则返回NULL
。如果坚持一个索引,考虑更广泛的类型。
避免重复呼叫
而不是每次在
for()
循环中使用strlen()
,使用
const
这允许使用
const
字符串。全部在一起(仍然返回一个位置索引)
nfg76nw03#
我建议的唯一修改是
for
循环条件。在代码中,strlen
将在每次迭代中被调用。另外,条件应该是<,因为你不是在寻找C字符串终止字符。https://godbolt.org/z/Kfs8hvW5d
您还可以添加一些检查: