2016-07-25 45 views
0

除了閱讀所有理論部分外,我無法做到這個問題。 編寫一個程序來扭轉存儲在以下 數組的指針在爲字符串的字符串:我可以在函數中有效地實現指向字符串的指針?

char *s[ ] = { 
"To err is human...", 
"But to really mess things up...", 
"One needs to know C!!" 
} ; 

這裏是我的代碼

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

int main() 
{ int i; 
    char *s[] = { 
       "To err is human...", 
       "But to really mess things up...", 
       "One needs to know C!!" 
       } ; 
    for(i=0;i<3;i++) 
    { 
    xstrrev(s[i]); 
    puts(s[i]); 
    } 
return 0; 
} 
xstrrev(char *str) 
{ 
    char *temp[]; 
    int len,j; 
    len=strlen(str); 
    for(j=0;j<(len)/2;j++) 
     { 

     *temp=*(str+len-j-1); 
     *(str+len-j-1)=*(str+j); 
     *(str+j)=*temp; 

     } 
} 
+0

會發生什麼情況?什麼不發生?你爲什麼認爲你無法回答這個問題?你的問題與「有效」有什麼關係? – Arkadiy

+0

尋求調試幫助的問題(「爲什麼這個代碼不工作?」)必須包含所需的行爲,特定的問題或錯誤以及在問題本身中重現問題所需的最短代碼。沒有明確問題陳述的問題對其他讀者無益。請參閱:如何創建最小,完整和可驗證示例。 – Olaf

回答

0

的聲明數組

char *s[ ] = { 
"To err is human...", 
"But to really mess things up...", 
"One needs to know C!!" 
} ; 

是一個數組指向字符串文字的指針。您不能更改字符串文字,因爲它們在C和C++中是不可變的。任何修改字符串文字的嘗試都會導致程序未定義的行爲。

聲明數組作爲一個二維數組方式如下

char s[ ][32] = { 
"To err is human...", 
"But to really mess things up...", 
"One needs to know C!!" 
} ; 

如果你的意思扭轉這種指向字符串常量的指針,那麼你確實可以扭轉他們是反向指向的字符串的順序到數組的元素。

下面是一個示範程序,它示出了如何扭轉存儲在兩維陣列的每個字符串

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

char * reverse(char *s) 
{ 
    size_t n = strlen(s); 

    for (size_t i = 0; i < n/2; i++ ) 
    { 
     char c = s[i]; 
     s[i] = s[n-i-1]; 
     s[n-i-1] = c; 
    } 

    return s; 
} 

int main(void) 
{ 
    char s[][32] = 
    { 
     "To err is human...", 
     "But to really mess things up...", 
     "One needs to know C!!" 
    }; 

    const size_t N = sizeof(s)/sizeof(*s); 

    for(size_t i = 0; i < N; i++) puts(s[i]); 
    printf("\n"); 
    for(size_t i = 0; i < N; i++) puts(reverse(s[i])); 

    return 0; 
} 

它的輸出是

To err is human... 
But to really mess things up... 
One needs to know C!! 

...namuh si rre oT 
...pu sgniht ssem yllaer ot tuB 
!!C wonk ot sdeen enO 

至於函數xstrrev

xstrrev(char *str) 
{ 
    char *temp[]; 
    int len,j; 
    len=strlen(str); 
    for(j=0;j<(len)/2;j++) 
     { 

     *temp=*(str+len-j-1); 
     *(str+len-j-1)=*(str+j); 
     *(str+j)=*temp; 

     } 
} 

那麼它是無效的,新的編譯器不會編譯我噸。首先該函數不具有返回類型。 數組的聲明

char *temp[]; 

由於省略了元素的數量而無效。變量strlen沒有聲明。

+0

此外,字符串的聲明已經在問題中的指針形式中給出,我必須僅以這種方式解決它。 –

1

你不說你有什麼問題。但是,我會指出幾件事情:

  1. 您正在main中創建常量字符串。根據你編碼的環境,這些常量字符串可能會被放入真正的常量內存中。 (例如:ROM。)因此,您應該可能是strdupmalloc顛倒的字符串。

  2. 在您的xstrrev函數中,您似乎對基本類型有點困惑。請記住,C中的「字符串」只是一堆相鄰的對象,標記值標記爲結尾。如果你要交換兩個char對象,你不需要通過指針間接地存儲,你可以說char temp;後來說temp = *ptr;

  3. 爲了提高效率,以及你自己的理智,我建議您在xstrrev中創建了第二個指針。將它稱爲char * end並進行數學運算,使其指向字符串的末尾。然後你可以用++str; --end;來調整你的交換指針,而不是把所有的表達式放在裏面,每個表達式都是潛在的錯誤來源。