ページ 11

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

Posted: 2017年3月31日(金) 14:53
by みうけい
#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);
}

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

Posted: 2017年3月31日(金) 15:00
by みけCAT
ソースコードを提示する際は、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;
      }
}

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

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

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

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

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

Posted: 2017年3月31日(金) 15:43
by みうけい
すいません。const を消し忘れていました。消した後、うまく動作しました。
本当にありがとうございます。

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

Posted: 2017年4月02日(日) 12:36
by かずま
みうけい さんが書きました:すいません。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: 文字列の反転をポインタを使わずに関数で行いたいのですが、どうすればいいでしょうか。

Posted: 2017年4月02日(日) 20:12
by みうけい
別解ありがとうございます。無事解決できました。