電子書籍の厳選無料作品が豊富!

c言語でポインタ変数を用いた配列の反転操作を行いたいのですが、文字列の反転の仕方が分かりません。流れとしては、文字列の長さを調べてから文字列を反転して表示するという感じです。どうか教えてください。また、その他問題点があればご指摘よろしくお願いします。

#include <stdio.h>

int strlength(char *str) { /* 文字列の長さを調べる /*
int length = 0;

while (*str++ != '\0'){
length++;
}
return length;
}

int main(void) { /*配列strSrc[]の文字列を逆にして配列strDst[]に格納する */
char strSrc[] = "reverse this";
char *pC;
char strDst[] = "01234567890123456789";
char *pD;
int length;

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

/* この部分が分かりません */

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

return( 0 );
}

A 回答 (15件中11~15件)

>エラーになどなりません。

正しいコードです。

失礼しました。
ポインタではなく配列でしたね。ご指摘のとおりです。

>静的に、という言葉の使い方が間違っています。

mallocで「動的に」確保することとの対比で使ってます。
しかし、スタック上に自動的に配置されるのですから、ある意味動的ですね。
正確には、staticを指定してスコープを抜けても保持される場合が「静的」だというのは異論ありません。

>要素数を省略した場合は、右辺で記述した分だけの領域を
>自動的に確保します。つまり、終端の'\0'の分を含めて

これもそのとおりなんですが、質問文にあるstrDstは、データ格納先を確保するために宣言されています。なので、その時点で終端の分を含めるか否かは瑣末だと思いますが?
不正確な回答をした非は私にありますが、本題と関係のない指摘は質問者にも閲覧する人にも不利益となると思います。
    • good
    • 0

>#1さん


もう一つ。

>char strDst[20];
>上記のように静的にサイズを指定するか、

静的に、という言葉の使い方が間違っています。
さらに、

>char strDst[] = "01234567890123456789";

要素数を省略した場合は、右辺で記述した分だけの領域を
自動的に確保します。つまり、終端の'\0'の分を含めて

char strDst[21] = "01234567890123456789";

と書いたのと同じです。

# C言語の基礎的なところが本当にわかっているのだろうか?専門家じゃないでしょ。
    • good
    • 0

>#1さん


>"01234567890123456789"はリテラル文字列です。処理系によっては書込み禁止にする場合があるので、エラーになるかもしれません。

エラーになどなりません。正しいコードです。
char strDst[] = "01234567890123456789";
において、strDstは配列です。したがって、
char strDst[] = {'0','1','2','3','4','5','6','7','8','9',
'0','1','2','3','4','5','6','7','8','9','\0'};
と書いたのと同じ意味です。

質問されているかたをあまり惑わさない方がよいです。
    • good
    • 0

 


#include <stdio.h>

int strlength(char *str) { /* 文字列の長さを調べる */
int length = 0;

while (*str ++ != '\0'){
length++;
}
return length;
}

int main(void)
{ /*配列strSrc[]の文字列を逆にして配列strDst[]に格納する */
char strSrc[] = "reverse this";
char *pC = strSrc;
char strDst[] = "01234567890123456789";
char *pD = strDst;
int length = strlength(strSrc);

printf( "%s\n", strSrc );
while(length --) *pD ++ = *(pC + length);
*pD = '\0';
printf("%s\n", strDst ) ;

return 0;
}
    • good
    • 0

>int strlength(char *str) { /* 文字列の長さを調べる /*



学習のために実装するのならかまいませんが、そうでなければ標準関数のstrlen()を使いましょう。
あと、最後の/*は*/ですね。

>char strDst[] = "01234567890123456789";

"01234567890123456789"はリテラル文字列です。処理系によっては書込み禁止にする場合があるので、エラーになるかもしれません。
反転したデータを保存する領域をとる場合は、

char strDst[20];
上記のように静的にサイズを指定するか、

char* strDst = malloc(strlen(strDst)+1);
このように動的に領域を取得するか、どちらかを使ってください。

>/* この部分が分かりません */

考え方としては、strSrcの先頭から文字を取り出し、strDstの最後から文字を入れていく、という処理になります。
注意が必要なのは下記の2点です。

1.strDstの領域の最後ではなく、strSrcの文字列サイズの最後
strDst[19]ではなく、strDst[strlen(strDst)-1]です。

2.strSrcの最後には必ず'\0'を入れる
あらかじめstrDst全体を'\0'でクリアするか、strDst[strlen(strDst)]に'\0'をセットする。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!