2015-09-24 95 views
1

我試圖通過void函數來反轉字符串,但是對於「str」它存儲的只讀內存(正如我從搜索現有的線程在論壇中所知)發生分段錯誤。修改char * str的內容

我試圖在「反向」函數中使用strcpy(copy,str),但它只是反轉新創建的char數組「copy」,它不能返回到main函數。我不想在反向函數中使用printf(「%s」,copy)來打印反轉的字符串。

反正是有扭轉str

  1. 沒有將其更改爲char str[] = "Hello"
  2. 在不改變代碼main()功能
  3. 保持功能類型的reverse()作爲void
void reverse(char* str) 
{ 
    int l = strlen(str); 
    char temp; 
    int j = length - 1; 

    for (int i = 0; i < j; ++i) 
    { 
    temp = str[i]; 
    str[i] = str[j]; 
    str[j] = temp; 
    --j; 
    } 
} 

int main(int argc, char* argv[]) 
{ 
    char* str = "Hello"; 
    reverse(str); 
    printf("%s\n", str); 
    return 0; 
} 
+0

可能重複或C++?](http://stackoverflow.com/questions/198199/how-do-you-reverse-a-string-in-place-in-c-or-c) – Parappa

+2

簡答題(至少問題1& 3)是「否」。像這樣分配的「char *」將是隻讀的。你不能用當前的'reverse(char * str)'函數簽名來改變指針。你需要一個可寫的源數組,或者是一種反向分配新內存的方法(並且返回新的指針)。 – Joe

+0

「Hello」是一個字符串常量,具有靜態作用域,因此編譯器可以將它放在只讀內存中。如果你想反轉它,你應該在main(使用strcpy)中複製數據並將指向複製數據的指針傳遞給reverse()。 – Parappa

回答

3

問題是你不能修改字符串常量。

嘗試這樣的:上面

char str[] = "Hello"; 
reverse(str); 

str不再是一個字符串文字,它的初始化爲{'H', 'e', 'l', 'l', 'o', '\0'}一個數組,這樣你就可以修改它的內容,如果你想。

或者你可以使用malloc()

char *str = malloc(6); 
if (str != NULL) 
{ 
    strcpy(str, "Hello"); 
    reverse(str); 
    fprintf(stdout, "%s\n", str); 
    /* And never forget to `free' */ 
    free(str); 
} 

當定義字符串常量使用const,以保護它不被修改,至少意外這麼做。

沒有辦法滿足這些要求

  1. 沒有將其更改爲char str[] = "Hello"

    因爲你不能修改字符串常量

  2. 如果沒有main()功能改變代碼

    因爲這將需要程序來修改字符串文字和你不能

第三個要求,不會產生任何問題的。

-4

每次使用指針時,必須使用C中的malloc()或C++中的new(),這可能是問題所在。但你總是可以投去參考任何其地址返回給指針像我下面做

DEMO:http://ideone.com/LnOtDL

​​ 的[你如何在C反向串到位
+0

是的,我知道,但地獄它的工作..即使它複雜的代碼..我不是一個程序員我是一個反向工程師,但我認爲我發現這個問題,它是沒有'malloc/new'字符串的指針。我會嘗試修復答案,使其更好 – SSpoke

+2

它根本不起作用,它會導致未定義的行爲。 –

+0

現在它工作對不起,我沒有甚至檢查它,甚至沒有錯字 – SSpoke