2014-12-05 57 views
2

我想實現一個代碼,它使用了一個名爲reverse的函數,它接受一個字符串並返回一個與舊字符串相反的新字符串。據我所知,函數本身可以正常工作 - 也就是說,我測試了一下,看看反向字符串:new字符串是否具有正確的值,並且它是否正確。但是,當我嘗試打印這個反向字符串後,它已被返回到主函數我得到一個錯誤的訪問代碼。有沒有人有任何想法?這是我的代碼:函數可以返回字符串作爲它們的輸出嗎?

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

char reverse(char *string) { 
char newstring[50]; //reversed string to be returned to the main function 
int size = strlen(string); 
int index = 0; 
for (index = 0 ; index < size ; index++) { 
    newstring[index] = *(string+size-index-1); //creates a new string that is the reverse of  the old string 
} 
return newstring; //reurns the new string 
} 


int main(int argc, const char * argv[]) { 

char string[50]; 
printf("Please enter a string you wish to reverse:\n"); 
scanf("%49s", string); // user enters a string of maximum length 50 
int size = strlen(string); 
char *reverse_string; 
reverse_string = reverse(string); // sets a pointer called reverse_string to the pointer returned by the reverse function 
for (int index = 0 ; index < size ; index++) { 
    printf("%c", *(reverse_string+index));// prints the reversed string value by value 
} 
    return 0; 
} 
+2

函數可以返回字符串的地址,而不是字符串本身。 – chux 2014-12-05 04:05:03

+3

由於'newstring'是一個局部變量,所以返回'newstring'是一個問題。 – chux 2014-12-05 04:06:28

+0

函數可以返回指針。 – 2014-12-05 04:26:04

回答

2

您需要更改函數的聲明,以便它返回char *而不僅僅是char。在你的主循環中,你目前正在爲reverse_string分配一個char而不是char *。

+1

好,那麼我該怎麼做?我試着改變函數聲明爲:char * reverse(char * string),但是當我嘗試反轉字符串時:蘋果我所得到的是e ??? 0 – Adam 2014-12-05 10:20:15

+0

您還需要malloc(爲內存分配)變量_newstring_在反函數內,因爲它是一個局部變量。記住你可以在這裏使用sizeof()函數來使事情更健壯:) – TheOmegaPostulate 2014-12-07 22:27:41

0
char reverse(char *string) 

函數返回是一個char數據類型。它將允許你返回一個字符而不是整個字符串。您可以將數據類型作爲返回指向char的指針。 char *。它將允許你返回一個字符串。

然後使用該函數中的變量並使用malloc函數分配內存。如果你使用普通變量,那麼它將不起作用。

0

無論何時在c中打開花括號,都會創建一個新的堆棧框架,並且當您關閉相應的花括號時,它會被銷燬破壞。問題是在這些大括號內創建的所有變量也被破壞,並且您返回的任何address都是無用的,因爲它不存在。此問題的解決方法是您可以在堆上分配內存(使用malloc)並返回地址(堆由整個程序共享),或者可以將字符串作爲參數傳遞並使用它來存儲反向字符串(僞調用-引用)。

0

假設reverse()的聲明確實返回了char *,問題是您要返回一個指向reverse()中本地聲明的變量(newstring)的指針。這意味着一旦您退出該功能,該變量的地址就不再可用。您至少有以下選項:

  1. 聲明全局變量(在函數定義上方)。

  2. 創建(例如使用malloc)堆上的變量:

    字符* newstring =(字符*)malloc的(50);

0
  1. 代碼不應該試圖返回局部變量newstring的地址是使用了後引用(printf("%c",...)的那個時候,局部變量的內容和存在是無效的。

  2. 當返回一個指針時,函數的返回類型應該是一個類似於char *reverse()而不是char reverse()的指針。

  3. 這一切都可以通過反轉字符串到位解決。

    void reverse2(char *string) { 
        size_t rightp1 = strlen(string); 
        size_t left = 0; 
        while (left < rightp1) { 
        rightp1--; 
        char t = string[left]; 
        string[left] = string[rightp1]; 
        string[rightp1] = t; 
        left++; 
        } 
    
    int main(int argc, const char * argv[]) { 
        ... 
        scanf("%49s", string); 
        reverse(string); 
        fputs(string, stdout); 
        return 0; 
    } 
    
相關問題