所以我的问题是我需要使用for循环在更大的字符串中找到子字符串的数字位置。我不能使用诸如strstr之类的字符串函数,并且我已经尝试了大多数嵌套for循环的迭代。
基本上我需要一个遍历字符串寻找某个子字符串的循环,如果它与第一个字符匹配,则检查其余的字符是否匹配。
如果一切都匹配,它将返回子串的第一个字符的位置,如果没有找到,则返回-1。
非常感谢任何帮助。谢谢!
答案 0 :(得分:1)
正如您正确描述的那样,这可以通过2个嵌套循环来完成:
#include <stdlib.h> // for size_t
int indexof(const char *str, const char *substr) {
for (size_t i = 0;; i++) {
/* for every position in the string */
for (size_t j = 0;; j++) {
/* check of all characters fro substr match at this offset */
if (substr[j] == '\0') {
/* if we reach the end of substr, we have a match at offset i */
return i;
}
if (str[i + j] != substr[j]) {
/* if there is a mismatch, stop checking and skip to the next offset */
break;
}
}
if (str[i] == '\0') {
/* no match found: return -1 */
return -1;
}
}
}
注意:
该函数被指定为返回int
,因为它返回-1
表示不匹配。然而,匹配的偏移可能不适合int
的范围。如果可以访问超过2GB的数据,则返回在POSIX中定义的签名类型(例如ssize_t
)将无法在32位系统上完全解决此问题。
通过明确测试子字符串的第一个字符,可以使函数更快一些。
对于长字符串和子字符串,Boyer Moore's和Knuth Morris Pratt's等更高级的算法可以更快地运行。