2016-02-23 248 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