2013-04-23 66 views
1

我有一個奇怪的錯誤與我的字符串的長度。我對此很新,所以這可能是我錯過的一些基本知識。反轉C壞字符串中的字符串

我想寫一個程序,它獲取一個指向字符數組的指針(IE的第一個字符的字符串),它返回一個指向與第一個字符大小相同的字符串的指針,但這些字母是逆轉。例如,計算機將成爲retupmoC。 tacocat會留在這裏tacocat :)

的代碼:

char* return_flipped_string(char* stringptr) 
{ 
    int i=0,size_of_string=length_of_string(stringptr); 
    char *flipped; 
    flipped=(char *)malloc(size_of_string*sizeof(char)); 
    while(i<size_of_string) 
    { 
     *(flipped+i)=*(stringptr+size_of_string-1-i); 
     i++; 
    } 
    return flipped; 
} 

stringptr是一個指向原始字符串,翻轉是一個我回來了。 當我打印翻轉的字符串時,它顯示原始翻轉的字符串,然後是無法區分的亂碼。由於某種原因,它們的尺寸不一樣。

這裏是我寫的查找字符串的長度碼(正常工作)

int length_of_string(char* stringptr) 
{ 
    int length=0,i=0; 
    while(*(stringptr+i)!='\0') 
    { 
     length++; 
     i++; 
    } 
    return length; 
} 
+0

提示:在你的長度函數中,'i'和'length'將會是相同的,所以不妨使用'i'。 – 2013-04-23 21:48:34

+1

您寫了length_of_string而不是僅僅使用標準strlen()函數的任何特定原因? – 2013-04-23 21:51:22

+0

@MarcB:對,我沒有注意到。感謝您的貢獻。 – 2013-04-23 21:53:06

回答

1

您錯過了NUL終止字符。您需要爲flipped分配一個額外字符,並在末尾明確添加。

char* return_flipped_string(char* stringptr) 
{ 
    int i=0,size_of_string=length_of_string(stringptr); 
    char *flipped; 
    flipped=(char *)malloc((size_of_string + 1)*sizeof(char)); 
    while(i<size_of_string) 
    { 
     *(flipped+i)=*(stringptr+size_of_string-1-i); 
     i++; 
    } 
    *(flipped+1) = '\0'; 
    return flipped; 
} 

順便說一句 - 你知道標準庫中的strlen函數嗎?你的length_of_string函數複製它。我不記得strrev是否在ANSI/ISO標準中。

+0

我嘗試使用strlen,但它收到一個const char的參數。我只想使用指針。所以要麼我錯誤地使用了strlen,要麼就是不適合這裏。我很想澄清一下。 – 2013-04-23 21:54:49

+0

'strlen'的參數是一個「指向const char的指針」,所以'strlen(「12345678」)== 8'。只要包含'',您就可以用'strlen'替換'length_of_string'。 – 2013-04-23 21:59:45

3

需要NULL終止字符串....像這樣..

while(i<size_of_string) 
    { 
     *(flipped+i)=*(stringptr+size_of_string-1-i); 
     i++; 
    } 
    flipped[size_of_string]=0; 
    return flipped; 
4

你需要在翻轉的字符串的末尾追加一個空字節('\ 0')。翻轉的字符串數據緩衝區的長度是輸入字符串的長度加上一個空字符串終止符字節的。它是指示字符串結束位置的空字節。

0

有在C.℃的字符串沒有這樣的東西已經字符(char)陣列,其是interpretted(約定),爲字符串時,它們含有NUL字符('\0')。找到的第一個NUL終止該字符串。如果您的陣列不包含NUL,那麼任何標準字符串函數都會繼續讀取從您提供的地址開始的緩衝區,直到遇到空字節爲止。

因此,胡言亂語。