- 締切済み
ポインタの問題です
学校の課題である文字列をポインタを使って逆順に表示するというプログラムを作ったのですが、「問題で引数で与えられた文字列を逆順とする関数を作成せよ.ただし文字数が最大256文字であると仮定して良い.」ということなんですが、課題が求めている答えと自分が作ったプログラムがあっているか確認お願いします。 #include <stdio.h> void reverseWord(char *str); void main(void) { char *str = "sapporo"; char *p, *q; printf("元: %s\n", str); p = q = str; while (*q != '\0') q++; printf("逆順:"); while (q >= p) putchar(*q--); printf("\n"); } よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- yama5140
- ベストアンサー率54% (136/250)
>ただし文字数が最大256文字であると仮定して良い と、char *str = "sapporo"; の整合は、大丈夫なんだろうか?。 「回答」から調整できるんだろうか?(文字列の入力方法など)。 また、「学校」なのに、void main(void) でいいのか心配。 (過去の質問と違うよ) この辺り、空気を読まないと・・。 >課題が求めている答えと自分が作ったプログラムがあっているか確認お願いします。 コンパイラがあれば、自分で確認できます。今回は、oroppas となればいいわけだから。 こんなのを他人に確認させるのは、失礼かと・・。 早急に、家にパソコン・開発環境を整備したほうがよい、と思います。 なお、課題は、 >引数で与えられた文字列を逆順とする関数を作成せよ. で、全然出来ていないのに、 >・・というプログラムを作ったのですが、・・ >・・自分が作ったプログラムが・・ 「作った」と言いきれるところが、大樹の片鱗というか(*)、すごいと思います。 (単なるナルシストだったり・・、で、こんな質問文になるのかな・・) ☆「ここは、できない」とハッキリしたほうが、(*:イヤミを言われることなく)良い回答が付くと思います。 ----------------------------------------- 下のソースで「待避」とあるのは、 ・酒の入ったコップ ・水の入った茶碗があるとき、 茶碗に酒、コップに水としたいとき、空の容器が必要になりますよね、それを想像すればよいかと。 #include <stdio.h> #include <string.h> void reverseWord( char *str ) { char cDum, *p, *q; p = str; // 文字列先頭 q = p + strlen( str ) - 1; // 文字列末尾 while( p < q ){ // 文字列中央まで cDum = *p; // 待避 *p++ = *q; *q-- = cDum; } } void main( void ) // 要調整 { char str[ 256 ] = "sapporo"; // 要調整 printf( "元順: %s\n", str ); reverseWord( str ); printf( "逆順: %s\n", str ); } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。
- S117
- ベストアンサー率40% (18/45)
文字列を逆順にする関数を作ってないので題意に沿っていないでしょう。出力にもNUL文字(0x00)が入ってしまいますし。 なお、問題文はその意図するところが不明確です。 >引数で与えられた文字列を逆順とする関数を作成せよ.ただし文字数が最大256文字であると仮定して良い. どうやら引数の文字列を逆順にする関数を作ればいいようですが、反転した文字列の出力方法がわかりません。以下のような方法が考えられます。 1,引数の文字列を破壊的に変更する。 void reverseString(char *str); 2,引数の文字列を指定されたバッファへ書き出す。 void reverseString(const char *src, char *dest); 3,動的確保したバッファに書き込み、そのポインタを返す。 char *reverseString(const char *src); 4,静的な記憶領域に書き込み、そのポインタを返す。 char *reverseString(const char *src); 「ただし文字数が最大256文字であると仮定して良い」 という文が意味をなすには4の仕様しか考えられませんが、一方でこの方法は静的領域を使うために、複数の文字列を同時に扱えません。 char *a, *b; a = reverseString("abcdef"); //内部バッファは"fedcba" b = reverseString("12345"); //内部バッファは"54321" puts(a);// 54321 puts(b);// 54321 //aもbも同じ内部バッファを参照するため、最後の呼び出しの結果を持つ。 この制限は題意にないため、常識的に考えればとうてい受け入れられません。 よって、1~3になりますが、いずれも処理する文字列のサイズを制限する必要がありません。もちろん、「して良い」なのでしなくても良いはずです。 Cでは一般的にメモリ確保関数以外が返したポインタはfreeしなくていいようにします。標準関数の例を見ても1か2にすべきでしょう。 場合によりますが、破壊的な変更をする関数はあまりよくないです。 (教育現場ではしばしば用いられるようですが) というわけで、2の方法で作りましょう。 この場合、呼び出し元が責任を持って元の文字列と同じサイズのバッファを用意することで、関数自体ではバッファサイズを気にする必要がなくなります。 なお、もしも問題に >引数で与えられた文字列を逆順とする関数を作成せよ.ただし文字数が最大256文字であると仮定して良い. 以外の条件が与えられている場合、上記のアドバイスは無視する必要があるでしょう。条件にない部分はCの常識に基づき補完していますが、しばしば教育の場では異なる仕様が求められます。
- Tacosan
- ベストアンサー率23% (3656/15482)
えっと.... 全く課題の要求に答えていないうえに, バグまで持ってます. 「確認お願いします」だから, これだけでいいよね.... というか, これで課題が求めている答えとあっていると一瞬でも思ったというのであれば, 「どこがどのようにあっているのか」を書いてください.
- asuncion
- ベストアンサー率33% (2127/6289)
>void reverseWord(char *str); プロトタイプ宣言だけで、実体がありません。 いいのでしょうか?