2016-02-23 129 views
0

我正在尝试搜索字符串指针中的字符串。我不确定如何解释我正在努力达到的目标,但我会尽我所能。在“字符串指针”中寻找字符串 - C语言

比方说,我有两个字符串指针char *p = "hello world"char *q = "world",为worldhello world,所以我想返回一个指针*start指向的*pw。我希望这是有道理的,如果不是,请随时在下面发表评论。

注:不幸的是,我不能使用任何string.h库函数,除了strlen(),而且我不允许使用索引其实我不允许使用任何方括号[]

P.S.忽略所有printf,因为他们在那里检查程序出错的地方。

#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; 
} 

只要它碰到w它就会提前退出循环。我不知道为什么它这样做? 这是我的问题

输出:

号码:ħ其中q进行比较:瓦特

号码:È其中q进行比较:瓦特

号码:升其中q进行比较:瓦特

p:l与q相比较:w

p:o与q相比较:w

号码:比较符合Q:W

未找到


编辑:

gcc -Wall filename.c编译器不给我任何类型的警告/错误的。

回答

2

for环比较i字符串p点的长度,但因为你不断改变p,该长度保持越来越小,这也就是为什么for遍历检查p半左右结束。

如果不是使用计数器i(你不会做别的用),你可以不是与while (*p != '\0')更换for循环:循环,直到你到达的p末。 (注意:只要剩下的长度小于字符串q指向的长度,您实际上可以停止该循环,但我会将其作为一个练习。)

+0

感谢您指出我所犯的错误。 :) –

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; 
} 

通过string所有可能的起始位置的第一for循环。第二个for比较从s开始的两个字符串中的每个字符。如果它发现一些字符差异或者任何一个字符串到达​​末尾,它将停止。如果find字符串已达到其结尾,则表示所有后续字符匹配:我们找到了我们的位置(即s)。如果外环没有匹配,find不作为子字符串存在。我们返回NULL