2016-05-31 71 views
2

我已經完成了一個函數,它反過來在參數中給出一個String(字符數組),但它不工作,爲什麼?逆c中的字符串

我得到這樣的:æIGt(千噸$ 0 @

感謝您

#include <stdio.h> 
#include <string.h> 

char * 
inverse(char *s) 
{ 
    int i, taille = strlen(s); 
    char r[taille]; 
    for (i = 0 ; i < taille ; i++) 
    { 
     r[i] = s[taille - i - 1]; 
    } 
    r[i] = '\0';  
    return r; 
} 

int 
main() 
{  
    char s[] = "kira"; 
    char *r = inverse(s); 

    printf("%s",r); 

    return 1; 
} 
+0

請更具體地說明什麼是不工作。它是否存在分割?未能編譯?給出不正確的結果? – merlin2011

+0

請寫出具有一致風格且可讀性強的代碼。而且,main()的成功值是'0'。或者更準確地說,是'EXIT_SUCCESS'。最後,如果你扭轉了字符串,你應該想!你需要交換多少個字符?然後你會明白爲什麼它不起作用。 –

+2

您正在返回本地數組的地址,但數組已分配到堆棧上,並且在函數返回時不再可用。你需要做以下三件事之一:(1)通過調用'malloc',讓'inverse'在堆上分配數組,(2)讓調用者傳遞一個指向所需結果數組的指針,或者(3) '在原地顛倒參數字符串。 –

回答

7

您正在返回一個指向局部變量的指針。當函數反轉返回時該變量被破壞,因此在函數退出後訪問指針將返回無效數據。

+0

我該如何解決它? –

+3

@AmarBessalah,或者通過char * r = malloc(taille + 1)'''在堆上分配內存,或者將''''r'''作爲輸出變量,或者將r內容複製回''' s''' – kaspersky

+0

@ gg.kaspersky你能向我解釋爲什麼當我不分配時,它不工作?謝謝 –

4

這是稍微很難說從你的問題,因爲你沒有給任何輸出,但我最好的猜測是,這是因爲你返回一個指向堆棧上的項目的指針,這將在下一次調用時被覆蓋,在你的情況下,你需要通過inverse一個地方來表達它的答案。試試這個:

#include <stdio.h> 
#include <string.h> 

void inverse(char *s, char *r) 
{ 
    int i,taille=strlen(s); 


    for(i=0;i<taille;i++) 
    { 
     r[i]=s[taille-i-1]; 
    } 
    r[i]='\0'; 
} 



int main() 
{ 

char s[] = "kira"; 
char r[sizeof(s)]; 

inverse(s, r);  

printf("%s",r); 

return 1; 
} 
1

反轉字符串的另一種標準方法是使用指針從字符串的開頭和結尾開始工作,每次迭代交換兩個字符。其交換代替原始的字符串(複印一份,如果你需要保留原始,或通過第二串並放置顛倒字符串中有)

/** strrevstr - reverse string, swaps 2 chars per-iteration. 
* Takes valid string and reverses, original is not preserved. 
* If 's' is valid and non-empty, returns pointer to 's', 
* returns NULL otherwise. 
*/ 
char *strrevstr (char *s) 
{ 
    if (!s || !*s) {  /* validate string is not NULL and non-empty */ 
     printf ("strrevstr() error: invalid string\n"); 
     return NULL; 
    } 

    char *begin = s; /* pointers to beginning and end, and tmp char */ 
    char *end = begin + strlen (s) - 1; 
    char tmp; 

    while (end > begin) /* swap both beginning and end each iteration */ 
    { 
     tmp = *end; 
     *end-- = *begin; 
     *begin++ = tmp; 
    } 

    return s; 
} 

正如你所知道的,有多種方式要解決這個問題,通過提供這些和其他答案,您應該能夠調整解決方案以滿足您的需求。

每種方法都有優點和缺點。動態分配一個新的內存塊來保存反​​向字符串沒有什麼問題,它只是增加了一個額外的責任:(1)保留一個指向新塊的起始地址的指針,這樣(2)當它不再被釋放時需要。如果您需要保留原始字符串,則將指針傳遞給足夠大小的字符數組以保存反轉字符串是保留原始字符串的另一個選項。

查看所有答案,並讓我知道如果您有任何問題。