2012-07-28 53 views
2

我已經編寫了交換字符串的代碼,但是我無法交換。什麼是問題,我怎樣才能解決它通過使用函數,swap通過交換函數進行字符串交換

#include <stdio.h> 

void swap(char*,char*); 
int main() 
{ 
    char *ptr[2] = {"hello", "morning"}; 
    swap(ptr[0], ptr[1]); 
    printf("%s %s", ptr[0], ptr[1]); 
    return 0; 
} 

void swap(char *t1, char*t2) 
{ 
    char *t; 
    t = t1; 

    t1 = t2; 
    t2 = t; 
} 

我也試圖通過(&ptr[0], &ptr[1]),但在這裏它顯示了segmentation fault。此外,我做了一個字符,*p1 = ptr[0], char *p1 = ptr[1],然後通過&p1&p2swap,但仍然出現分段錯誤。

回答

6

C函數參數是按值傳遞的。您將地址的值傳遞給您的swap函數,並期望這些值(地址)發生更改。但只有拷貝的地址在你的swap函數改變。

要改變實際傳入的解決,你需要參考的aditional的水平:

void swap(char **t1, char **t2) 
{ 
    char *t; 

    t = *t1; 
    *t1= *t2; 
    *t2 = t; 
} 

並稱之爲swap像這樣:swap(&ptr[0], &ptr[1]);

3

您需要傳遞指向您的字符串的指針來交換它們(char **)。否則,您所做的更改將在交換功能本地。

void swap(char **t1,char **t2) 
{ 
     char *t; 
     t = *t1; 

     *t1 = *t2; 
     *t2 =t; 
} 

int main() 
{ 
     char *ptr[2] = {"hello","mornig"}; 
     swap(&ptr[0], &ptr[1]); 
     printf("%s %s",ptr[0],ptr[1]); 
     return 0; 
} 
4

您需要傳遞指向char數組的指針才能切換它們。通過這樣做,您可以交換這些指針的值。 (這是實際的陣列。)

#include<stdio.h> 
void swap(char**,char**); 
int main() 
{ 
     char *ptr[2] = {"hello","mornig"}; 
     swap(&ptr[0], &ptr[1]); 
     printf("%s %s",ptr[0], ptr[1]); 
     return 0; 
} 

void swap(char **t1,char **t2) 
{ 
     char *t; 
     t = *t1; 

     *t1 = *t2; 
     *t2 =t; 
} 
1

char *ptr[2] = {"hello","mornig"}; - 這種說法意味着你分配一個大小爲2的數組,用於存儲兩個字符串的地址(即char *)。現在你給出的兩個字符串將在text segment這是一個只讀數據。如果我們試圖修改它,這會導致崩潰(分段錯誤)。

因此,如果您致電swap(&ptr[0], &ptr[1])導致崩潰。因爲您正嘗試在第一個只讀字符串h中編寫字符m。無法寫入text segment中的字符串。

如果你想簡單地交換一個字符串,你可以調用函數swap(&ptr[0], &ptr[1]),這相當於swap((ptr + 0),(ptr + 1));

,並更改交換功能如下

void swap(char **t1,char **t2) 
{ 
     char *t; 

     t = *t1; 
     *t1 = *t2; 
     *t2 =t; 
} 

在這裏,我們只是交換存儲在數組指針ptr字符串的地址。