2009-11-13 95 views
0

提供了一個指向字符串的指針數組作爲輸入。任務是反轉存儲在輸入指針數組中的每個字符串。我做了一個名爲reverseString()的函數,它反轉了傳遞給它的字符串。據我所知,這個功能正常工作。存儲在指向C中多個字符串的指針數組中的單個字符串存在問題

在輸入指針數組中存儲/引用的字符串被逐個發送到reverseString()函數。但是,當傳遞的字符串的值使用臨時變量交換時,代碼會在reverseString()函數的某個位置掛起。我無法弄清爲什麼代碼在交換值時掛起。請幫我解決一下這個。

的代碼如下:

#include <stdio.h> 
void reverseString(char*); 

int main() 
{ char *s[] = {"abcde", "12345", "65gb"}; 
    int i=0; 
    for(i=0; i< (sizeof(s)/sizeof(s[0])); i++) 
    { reverseString(s[i]); 
     printf("\n%s\n", s[i]); 
    } 

    getch(); 
    return 0; 
}//end main 

void reverseString(char *x) 
{ int len = strlen(x)-1; 
    int i=0; 
    char temp; 
    while(i <= len-i) 
    { temp = x[i]; 
     x[i] = x[len-i]; 
     x[len-i] = temp; 
      i++; 
    } 
}//end reverseString 
+0

這功課嗎? –

+0

我從參考書上學習C編程。這個問題是本書的練習之一。所以我想這不能歸類爲功課,可以嗎? (我不是很清楚這個,因爲我是一個新手在stackoverflow ...) – nhylated

+0

http://stackoverflow.com/questions/1614723/why-is-this-c-code-causing-a-segmentation-故障 即使功能名稱也是一樣的。 – AnT

回答

6

您正在嘗試更改字符串文字。

字符串文字通常不可修改,實際上應該聲明爲const

const char *s[] = {"abcde", "12345", "65gb"}; 
/* pointers to string literals */ 

如果你想修改字符串數組,試試這個:

char s[][24] = {"abcde", "12345", "65gb"}; 
/* non-readonly array initialized from string literals */ 

編譯器會自動確定您需要3串,但不能確定每個需要等多久。我已經讓他們24字節長。

+0

澄清:在第一個示例(和問題中的代碼)中,您有指向字符串文本(它是隻讀的)的指針。在第二個例子中,你有一個非只讀數組,初始化_from_字符串文字。 –

+0

謝謝@Pavel。希望您不要介意我將您的評論複製到我的答案中。 – pmg

+0

感謝pmg&Pavel。我瞭解這個問題,我的代碼現在可以工作了... – nhylated

2

字符串( 「ABCDE」 等)可以被存儲在只讀存儲器。因此,當您嘗試修改這些字符串時,任何事情都是可能的。指向字符串的指針是可修改的;它只是它們本身不是的。

你應該包括<string.h>獲得的strlen(3)的聲明,另一頭獲取功能getch() - 它不是在<stdio.h>我的MacOS X系統上(所以我刪除電話;它在任何<stdio.h><conio.h>可能宣佈在Windows上)。

+0

'getch()'在'';這當然是非標準的(我認爲,起源於Turbo C)。 –

+0

謝謝帕維爾;我會盡力記住這一點。 –

0

希望這可以幫助你!我在這裏做的是我要去的字符串中的最後一個字符的地址,然後通過減少指針1個單位(字符2字節(請檢查))將它們全部打印出來。

//program to reverse the strings in an array of pointers 
#include<stdio.h> 
#include<string.h> 
int main() 
{ 
    char *str[] = { 
     "to err is human....", 
     "But to really mess things up...", 
     "One needs to know C!!" 
    }; 
    int i=0; //for different strings 
    char *p; //declaring a pointer whose value i will be setting to the last character in 
       //the respective string 
    while(i<3) 
    { 
     p=str[i]+strlen(str[i])-1; 
     while(*p!='\0') 
     { 
      printf("%c",*p); 
      p--; 
     } 
     printf("\n");  
     i++; 
    } 
} 
相關問題