2014-03-30 94 views
1

我已經編寫了下面的函數,將在C反向的字符串:在C中反轉字符串的函數 - 如果是字符串文字呢?

void reverse(char *str) { 
     int length = strlen(str) - 1; 
     for (int i=0; i < length/2; i++) { 
       char tmp = str[i]; 
       str[i] = str[length - i]; 
       str[length - i] = tmp; 
     } 
} 

這個作品,如果我這樣做:

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

但如果我把它傳遞一個字符串,如:

char *a = "Hello"; 

它不起作用。

那麼,我將如何修改我的函數,以便它可以接受字符串文字並將其反轉?

+3

簡單:你不能。 –

+0

所以,基本上我應該讓那些調用該函數的用戶知道字符串文字不能被傳遞? – StarTrek18

+2

真正的問題是,你不應該用非''const'指針來引用字符串文字。 –

回答

2

您字符串複製到一些其他臨時串的更好。

  1. 使用另一個char*複製原始字符串。分配足夠的內存。
  2. 將源字符串複製到此字符串。不要忘記null結束它。
  3. 反向..
  4. 不要忘記使用後釋放此內存。
char *a1 = "Hello"; 
char* copy_a1 = malloc(sizeof(char)*(strlen(a1)+1)); 
strncpy(copy_a1, a1, strlen(a1)); 
copy_a1[strlen(a1)] = '\0'; 
reverse(copy_a1); 
//free memory used. 
3

你不能做到這一點,字符串在C

常量也許,你需要複製的字符串,就像你在第一個例子中做到這一點,您使用字符串常量初始化一個字符數組。

0

問題是C歷史。

char *a = "Hello";應該是const char *a = "Hello";。但const在C成功後進來,所以char *a = "Hello";被允許保持良好的語法。

如果代碼爲const char *a = "Hello";reverse(a);會生成警告(或錯誤)。

要修改創建類似:

char *reverse(char *dest, const char *src);