2014-02-25 52 views
2

在我的一個任務中,我被要求使用線性搜索來查找字符串的最後一個字符並將其設置爲一個指針,它只是一個簡單的字符串,例如"blah blah blah"。要做到這一點我用線性搜索vs strlen

int length = strlen(string);

找到長度,然後用一個for循環

for (i=1;i<length;i++){ 
    if (string[i]==0){; 
     end_pointer = &string[i-1]; 
    } 

是否有使用線性搜索0設定指針,而不是使用長度之間有什麼區別:

end_pointer = &string[length-1]; 
+3

'如果(字符串[I] = 0)'是不正確的。您應該使用'=='進行比較,而不是'='。 – rcs

+0

對不起,固定的拼寫錯誤 – gptt916

+0

我認爲你錯過了作業的重點,我認爲當你的教師說線性搜索字符串的末尾時,他很可能意味着做一個無限的搜索,直到string [i] =='\ 0 ',這是字符串字符的標準結尾,否則它確實不是一個SEARCH,而更像是一個「啞」的循環。 – trumpetlicks

回答

3

我覺得是你的教授真正盼望的是:

int i = 0; 
while('\0' != string[i]) i++; 

的搜索

分配循環已完成最佳的效率後:

char * end_pointer = &string[i - 1]; 
+0

除末尾有'i == 0'外。 – ChronoTrigger

-1

我假設你上面貼的代碼是不是你寫的實際代碼,這將是:

for(i = 0; i < strlen(string); i++) { 
    if(string[ i ]){ 
     end_pointer = &string[i - 1]; 
    } 
} 

您可以通過兩種方式來實現:

char * end_pointer = &string[ strlen(string) - 1 ] 

for(i = 0; string[ i ] ; i++); 
char * end_pointer = &string[ i - 1 ] 

有效時調用strlen(),它運行在線性的時間來計算的長度。一旦你有了長度,你可以直接在字符串中索引,或者你可以自己搜索終止的'\ 0'字符。所有這些工作都假設您的字符串是以null結尾的。 編輯:第二個選項有一個「;」。

+0

然而,您的第二個答案與我的投票結果完全相同,除了您的選擇將花費更長時間,因爲您通過循環爲每次迭代指定了結束指針! – trumpetlicks

+0

當我開始回答問題時,沒有回覆,我剛剛提交了我的回覆後就看到了你的回覆。無論如何,謝謝你指出for循環錯誤,我錯過了打「;」在for循環之後。是的,它和你的while循環片段完全一樣。 – eerpini

0

我想我需要解釋如何將字符串存儲在C.

由於字符串可以,一般來說,有任意長度,需要有代表與字符串的內容沿長度的方法。表示長度的兩種最微不足道的方式如下。

  • 明確跟蹤長度的
  • 使用特殊標記來表示字符串

的C語言與第二個選項去年底。具體而言,'\0'用於表示字符串的結尾。所以如果你有一個char * p,那就是指向第一個字符的指針;字符串中的第二個字符是p[1] == *(p+1),依此類推。

那麼你如何得到字符串的長度?在表示字符串的第一種方法中(不是C方式),它已經明確可用。使用C字符串時,您必須從頭開始計算有多少個字符,直到特殊標記(C中的)。這稱爲線性標記結束的線性搜索。

strlen實現了這樣一個線性搜索,但它聽起來像你不應該使用它。無論如何,strlen實際上並沒有給你指向字符串結尾的指針;你將不得不計算它作爲

char *endPtr = string + strlen(string); 

在這種情況下,endPtr實際上會指向空終止字符,這是剛剛過去的字符串的結尾。這是C中用於指定範圍的常見範例:範圍的開始(在這種情況下爲string)通常爲,包括,並且範圍的末尾(在這種情況下爲endPtr)通常是獨佔


char *可能只是指向一個單一char而不一定是字符串,但此處沒有引起我們的關注。

0

使用線性搜索'\0'來設置指針而不是使用從strlen()導出的長度的差異是一個輕微的潛在效率變化。

如果您使用自己的代碼或使用標準庫函數strlen(),它仍然是複雜度爲O(n)的順序。如果有的話,srtrlen()有更高效的潛力。


如果目標是創建你自己的代碼,並點到最後char在一個字符串(不是'\0'),處理""作爲一種特殊情況,否則執行一個簡單的循環;

char *LastCharPointer(char *string) { 
    if (*string == '\0') { 
    return NULL; 
    } 
    do { 
    string++; 
    } while (*string); 
    return string - 1; 
} 

如果目標是指向空chanracter '\0'

char *NullCharPointer(char *string) { 
    while (*string) string++; 
    return string; 
}