文字列の反転をポインタを使わずに関数で行いたいのですが、どうすればいいでしょうか。

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

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: 文字列の反転をポインタを使わずに関数で行いたいのですが、どうすればいいでしょうか。

Re: 文字列の反転をポインタを使わずに関数で行いたいのですが、どうすればいいでしょうか。

#7

by みうけい » 8年前

別解ありがとうございます。無事解決できました。

Re: 文字列の反転をポインタを使わずに関数で行いたいのですが、どうすればいいでしょうか。

#6

by かずま » 8年前

みうけい さんが書きました:すいません。const を消し忘れていました。消した後、うまく動作しました。
解決したのなら、解決にチェックを入れて送信しましょう。

別解

コード:

#include <stdio.h>

int rev_string(char s[], int i)
{
    char c = s[i];
    return c ? s[i = rev_string(s, i+1)] = c, i+1 : 0;
}

int main(void)
{
    char str[128];
    printf("文字列を入力してください:");
    scanf("%127s", str);
    rev_string(str, 0);
    printf("反転後の文字列は %s です。\n", str);
    return 0;
}

Re: 文字列の反転をポインタを使わずに関数で行いたいのですが、どうすればいいでしょうか。

#5

by みうけい » 8年前

すいません。const を消し忘れていました。消した後、うまく動作しました。
本当にありがとうございます。

Re: 文字列の反転をポインタを使わずに関数で行いたいのですが、どうすればいいでしょうか。

#4

by みけCAT » 8年前

みうけい さんが書きました:実際にためしてみたところ、「assignment of read-only location」とエラーが表示されました。おそらく自分の使っているC言語の環境が悪いと考えられます。
元のコードではそのエラーが出ましたが、修正したコードは動作確認しました。
みうけいさんが見ているコードとコンパイラが見ているコードが同じかを確認してください。
・最新のソースコードを正しい位置に保存しましたか?
・本当に意図したソースコード(ファイル)をコンパイルしていますか?

Re: 文字列の反転をポインタを使わずに関数で行いたいのですが、どうすればいいでしょうか。

#3

by みうけい » 8年前

ご回答ありがとうございます。
実際にためしてみたところ、「assignment of read-only location」とエラーが表示されました。おそらく自分の使っているC言語の環境が悪いと考えられます。今後、他の環境で試してみて、うまくいかなかった場合、再びご質問させていただきます。
ありがとうございました。

Re: 文字列の反転をポインタを使わずに関数で行いたいのですが、どうすればいいでしょうか。

#2

by みけCAT » 8年前

ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
みうけい さんが書きました:文字列の反転をポインタを使わずに関数で行いたいのですが、どうすればいいでしょうか。
C言語では、文字列の処理には必ずポインタが使われます。
(式中で[]演算子(配列添字演算子)に渡された配列はポインタに変換されて処理されます)
したがって、文字列の反転をC言語でポインタを使わずに行うのは無理なので、諦めるか別の言語を使用するといいでしょう。
オフトピック
そもそもC言語を使うとは一言も書かれていませんが…
みうけい さんが書きました:下のようにやるとうまくいきません
  • 書き換えたいデータへのポインタにconstを付けない
  • 無駄に配列の範囲外にアクセスしない
という修正を行うと、「ポインタを使わずに」という条件は満たしませんが動くようです。

コード:

void rev_string(char s[])
{
      int i=0,j=0;
      char a;
      while(s[i++])j++;
      for(i=0;i<j/2;i++){
            a=s[i];
            s[i]=s[j-i-1];
            s[j-i-1]=a;
      }
}

文字列の反転をポインタを使わずに関数で行いたいのですが、どうすればいいでしょうか。

#1

by みうけい » 8年前

#include<stdio.h>
/*下のようにやるとうまくいきません*/
void rev_string(const char s[])
{
int i=0,j=0;
char a[2];
while(s[i++])j++;
for(i=0;i<j/2;i++){
a[2]=s;
s=s[j-i-1];
s[j-i-1]=a[2];
}
}

int main(void)
{
char str[128];
printf("文字列を入力してください:");
scanf("%s",str);
rev_string(str);
printf("反転後の文字列は %s です。",str);
}

ページトップ