2016-07-25 2 views
0

私はすべての理論の一部を読んでから離れてこの質問を行うことができないのです。文字列へのポインタの次 配列に格納された文字列を逆にするプログラムを書く :ここ関数を使用して、文字列へのポインタを効率的に実装するにはどうすればよいですか?

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

は私のコードは、宣言された配列

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

です文字列リテラルへのポインタ文字列リテラルはCやC++では不変なので、変更することはできません。文字列リテラルを変更しようとすると、プログラムの動作が未定義になります。

あなたは文字列リテラルを指すポインタを逆にする意味なら、あなたが実際にそれを指摘した文字列の順序を逆にされ、それらを逆にすることができ、次のよう

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

2次元配列として配列を宣言します配列の要素によって。ここ

は、二次元アレイに記憶された各文字列を逆にする方法を示して実証プログラムは、その出力が機能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; 

     } 
} 
として

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 

ある

#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; 
} 

あります

それは無効であり、新しいコンパイラは、私がコンパイルされませんt。まず関数の戻り値の型はありません。要素の数が省略されているので アレイ

char *temp[]; 

のこの宣言は無効です。変数strlenは宣言されていません。

+0

また、文字列の宣言はすでに質問のポインタ形式で与えられているので、私はそのようにしか解決できません。 –

1

あなたが持っているどのような問題言うことはありません。しかし、私はいくつかのことを指摘します:

  1. あなたのmainで定数文字列を作成しています。どのような環境をコーディングしているかによって、それらの定数文字列は本当に一定のメモリに置かれるかもしれません。 (例:ROM)その結果、あなたはどちらかstrdupmalloc逆に文字列おそらく必要があります。あなたのxstrrev機能で

  2. 、あなたは基本的なタイプについて少し混乱しているようです。 Cの「文字列」は終わりをマークするセンチネル値で、お互いの隣にcharオブジェクトのちょうど全体の束であることを忘れないでください。あなたは2つのcharオブジェクトを交換しようとしている場合は、ポインタを介して間接的に格納する必要はありません、あなただけのchar temp;を言うと、後で効率だけでなく、あなた自身の正気のためにtemp = *ptr;

  3. を言うことができ、私がお勧めしたいですxstrrevに2番目のポインタを作成します。それをchar * endと呼んで、文字列の最後を指し示すように数式を実行します。次に、++str; --end;でスワップポインタを調整することができ、それらのすべての表現が潜んでいる可能性があります。

関連する問題