这是代码:
int position(char *s1, char *s2) {
int i, j;
for (i = 0; s1[i]; i++) {
for (j = 0; s2[j] && s2[j] == s1[i + j]; j++);
if (!s2[j]) return i;
}
return -1;
}
int main() {
char word1[101], word2[101];
int p;
printf("Type two words: ");
scanf("%s %s", word1, word2);
p = position(word1, word2);
if (p < 0)
printf("Word'%s' does not exists in the sentence '%s'.", word2, word1);
else
printf("Position of the word '%s' is %d.", word2, p);
return 0;
}
第二个 for 循环如何工作?
如果函数检测到该单词,它是否返回 i
?如果是,如何返回?
最佳答案
循环for (j = 0; s2[j] && s2[j] == s1[i + j]; j++);
有一个空的 body ;
也可以写成:
for (j = 0; s2[j] && s2[j] == s1[i + j]; j++) {
/* empty */
}
或
for (j = 0; s2[j] && s2[j] == s1[i + j]; j++)
continue;
它计算 s2
的初始子字符串的长度匹配偏移量 i
处的字符以及 s1
的后续内容。循环结束时,j
是直到但不包括空终止符的匹配字符数。
这个初始子字符串是完整的字符串 s2
,可以通过比较 s2[j]
来测试到空终止符'\0'
,我们在位置 i
有一场比赛,因此if (!s2[j]) return i;
请注意,此函数返回 0
对于空子字符串 s2
,除非 s1
也是空的,这有些不一致。它应该返回 0
在所有情况下:
int position(const char *s1, const char *s2) {
int i, j;
for (i = 0;; i++) {
for (j = 0; s2[j] && s2[j] == s1[i + j]; j++)
continue;
if (!s2[j]) return i;
if (!s1[i]) return -1;
}
}
另请注意,如果 s1
,则此函数可能具有未定义的行为长于INT_MAX
,这在 64 位系统上是可能的,其中 int
有 32 位,指针和对象大小有 64 位。更改 int
会更安全变量和返回类型为 ptrdiff_t
定义于 <stddef.h>
,尽管还不够充分。
标准函数strstr
没有这些缺点,因为它被定义为返回指向匹配的指针:
char *strstr(const char *s1, const char *s2);
但请注意,在 C 中,它返回非 const
指针即使传递了 const
指针,可能会破坏 const
正确性。
这是使用相同算法的简单实现:
#include <string.h>
char *strstr(const char *s1, const char *s2) {
size_t i, j;
for (i = 0;; i++) {
for (j = 0; s2[j] && s2[j] == s1[i + j]; j++)
continue;
if (!s2[j]) return (char *)&s1[i];
if (!s1[i]) return NULL;
}
}
好的 C 库使用更复杂的算法,我鼓励您搜索和研究。
关于c - 查找子字符串 s2 在 s1 中的位置的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72062681/