ページ 11

ポインタを用いて文字列を逆順にして表示する

Posted: 2019年10月08日(火) 13:08
by H_A
#include<stdio.h>
#include<string.h>

void printf_rev(char *s){

int i, n=strlen(s);

for(i=0; i<n; i++){
s=s[n-i];
}

}

int main(void){

char *s;

printf("Enter word : ");
scanf("%s", s);
printf_rev(s);

printf("%s\n", s);

return 0;
}


実行すると何も表示されませんでした...
関数内の何が違うかわかりません、ヒントを教えてもらえると助かります。

Re: ポインタを用いて文字列を逆順にして表示する

Posted: 2019年10月08日(火) 14:12
by usao
オフトピック
ここでコードを提示する際はちゃんとタグを使って書かないとダメです.
(おそらく配列関係の記述がいくらか失われてしまっていると思うので,今の状態だと元のコード状態が不明)

ポインタで文字列の反転がどうの という話,
最近teratailで見たような気がするので,探してみたらどうか.

Re: ポインタを用いて文字列を逆順にして表示する

Posted: 2019年10月08日(火) 22:46
by みけCAT
main関数内の変数sが未初期化のまま使用されているので、強制終了の原因になります。
sに(mallocで確保した領域などの)有効なバッファへのポインタを代入してから
scanf以降を実行するようにしないといけません。

さらに、

コード:

        for(i=0; i<n; i++){
                s[i]=s[n-i];
        }
の部分も間違っていますね。
  • n文字の文字列の最後の文字はn-1番目 (0-origin)
  • 交換する際は、一旦データを退避させる (不要な方法もあるが、わかりにくいと考えられる)
  • 各要素を高々1回交換する
というポイントを踏まえ、

コード:

        for(i=0; i<n-i-1; i++){ /* 交換する要素がかぶらないようにする */
                char t=s[i]; /* データを退避させる */
                s[i]=s[n-i-1]; /* 交換対象を適切にする */
                s[n-i-1]=t;
        }
とするべきでしょう。
オフトピック
usao さんが書きました:
4年前
(おそらく配列関係の記述がいくらか失われてしまっていると思うので,今の状態だと元のコード状態が不明)
掲示板の変な仕様を踏んでしまうと別かもしれませんが、基本的に元のコードは失われないはずです。
引用ボタンを押すことで、元のコードを見ることができます。

Re: ポインタを用いて文字列を逆順にして表示する

Posted: 2019年10月09日(水) 10:01
by usao
オフトピック
引用で元を見れるのは知りませんでした.
なので,「失われ」という表現を用いました.

途中から斜体になっていることから

コード:

s[i]
と書いたのだろうな,とだけは察しは付くけど,他の現象の有無は自分はわからん(知らん)ので.