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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
H_A

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

#1

投稿記事 by H_A » 2ヶ月前

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


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

アバター
usao
記事: 1566
登録日時: 6年前

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

#2

投稿記事 by usao » 2ヶ月前

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

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

アバター
みけCAT
記事: 6246
登録日時: 9年前
住所: 千葉県
連絡を取る:

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

#3

投稿記事 by みけCAT » 2ヶ月前

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 さんが書きました:
2ヶ月前
(おそらく配列関係の記述がいくらか失われてしまっていると思うので,今の状態だと元のコード状態が不明)
掲示板の変な仕様を踏んでしまうと別かもしれませんが、基本的に元のコードは失われないはずです。
引用ボタンを押すことで、元のコードを見ることができます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
usao
記事: 1566
登録日時: 6年前

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

#4

投稿記事 by usao » 2ヶ月前

オフトピック
引用で元を見れるのは知りませんでした.
なので,「失われ」という表現を用いました.

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

コード:

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

返信

“C言語何でも質問掲示板” へ戻る