我正在尝试在字符串指针中搜索字符串。我不确定如何解释我想要实现的目标,但我会尽力而为。
我们说我有两个字符串指针char *p = "hello world"
和char *q = "world"
,world
位于hello world
,所以我想返回一个指针{{1 }}指向*start
的{{1}}。我希望这是有道理的,如果没有,请随时在下面发表评论。
注意:不幸的是,我不允许使用除w
之外的任何*p
库函数,而且我不允许使用索引,实际上我不被允许使用任何方括号string.h
。
P.S。忽略所有strlen()
,因为他们在那里检查程序出错的地方。
[]
一旦它到达printf
,它就会过早退出循环。我不知道为什么这样做? 这是我的问题。
输出:
p:h与q:w
比较p:e与q:w
比较p:l与q:w
进行比较p:l与q:w
进行比较p:o与q:w
进行比较p:与q:w
比较未找到
编辑:
#include <stdio.h>
#include <string.h>
int main(){
char *p = "hello world", *q = "world", *start;
int i, count = 0;
printf("%c\n", *p);
for (i = 0; i < strlen(p); i++){
printf("p: %c compares with q: %c\n", *p, *q);
if ( *p == *q){ // tried: if ( p == q)
start = p;
printf("start: %s\n", start);
while (*p == *q){ // tried: while ( p == q)
printf("p: %c compares with q: %c\n", *p, *q);
count ++;
p ++;
q ++;
if ( count == strlen(q) ){
printf("Found it\n");
return *start;
}
}
}
p ++;
}
printf("Not Found\n");
return 0;
}
编译器没有给我任何警告/错误。
答案 0 :(得分:2)
您的for
循环正在将i
与字符串p
指向的长度进行比较,但由于您不断更改p
,因此该长度会逐渐变小,这是为什么for
循环在检查p
的中途结束。
如果您没有使用计数器i
(您不做任何其他操作),而是使用for
循环替换while ( *p != '\0' )
循环,直到您到达终点p
。
(注意:一旦剩下的长度小于字符串q
指向的长度,你就可以实际停止该循环,但我将把它作为练习。)
答案 1 :(得分:0)
我相信这会奏效:
char* find_pos_in_string(char* string, char* find) {
for (char* s = string; *s != '\0'; ++s) {
char* f = find;
for (char* s_tmp = s; (*f == *s_tmp) && (*s_tmp != '\0') && (*f != '\0'); ++f, ++s_tmp);
if (*f == '\0') return s;
}
return NULL;
}
第一个for
循环遍历string
中所有可能的起始位置。第二个for
比较从s
开始的两个字符串中的每个字符。如果它找到一些字符差异或者任一字符串到达其结尾,它将停止。如果find
字符串已到达其末尾,则表示所有后续字符匹配:我们找到了我们的位置(即s
)。如果外部循环没有匹配,则find
不作为子字符串存在。我们返回NULL
。