2014-01-17 111 views
2

我用strrchr得到一些奇怪的結果。請幫幫我。奇怪的行爲與功能strrchr

這裏是我的代碼:

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
int main() 
{ 

    char szString[32] = "hello-world-and-everyone"; 
    char* ptemp = NULL; 
    ptemp = strrchr(szString, '-'); 
    if (ptemp == NULL) 
    { 
     printf("Invalid string\n"); 
     return 1; 
    } 
    printf("%s\n", szString); 
    printf("%s\n", ptemp); 
    *ptemp = 0; 
    printf("%s\n", szString); 
    return 0; 
} 

預期結果:

hello-world-and-everyone 
-everyone 
hello-world-and-everyone 

Acutal結果:

hello-world-and-everyone 
-everyone 
hello-world-and 
+0

請參閱'man strrchr' – lurker

回答

1

strrchr不分配並複製到一個新的字符串。它返回一個指向現有字符串的指針,其中給定的字符是。所以,當你這樣做:

*ptemp = 0; 

您在原始字符串在該位置設置的字符爲NULL(0)。並結束於:

hello-world-and 
1

C中的字符串是零終止的,這意味着值爲0的字符表示字符串的結尾。當你做了*ptemp = 0時,你在找到的字符串的開頭插入了一個字符,該字符串現在是原始字符串的結尾。

也許你打算空指針,而不是做ptemp = 0(no *)?

3

strrchr返回指向最後一次出現-szString的指針。

這裏:

*ptemp = 0; 

您可以設置它指向價值0NULL),取代了-。所以當你打印szString它現在結束,因爲字符串使用0終止。

將其更改爲:

*ptemp = 65; // ASCII 'A' 

和你的輸出將是:

你好,世界和大家
-everyone
你好,世界andAeveryone

4

實際結果是正確的(實際上這應該不令人意外)。

前兩行輸出與您的期望一致,所以我假設您理解得很好。這裏是正在發生的事情的最後兩行:第一行(分配)空終止szString在最後衝刺的位置:

*ptemp = 0; // Replaces the last dash '-' with '\0' 

因此字符串變成

h e l l o - w o r l d - a n d \0 e v e r y o n e \0 

當你現在打印,printf找到第一個終止符,然後停在那裏。這就是爲什麼你在輸出中看到截斷的字符串,而不是原來的字符串。