- ベストアンサー
名前を逆に表示して結合するプログラムの間違い
- 入力した名前を逆順に表示し、結合するプログラムのソースコードにはいくつかの誤りがあります。
- ソースコードの誤りを修正することで、正しい実行結果を得ることができます。
- 修正すべき箇所は、文字列の長さを取得する処理や文字列の逆順を取得する処理などです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> f=strlen(first); > while (first[f]!='\0'){ > FIRST[i]=first[19-i]; strlenで取得したfをそのままwhileの継続条件に投げているので即座に終了します。 ここの継続条件はfirst[i]!='\0'でしょう。 secondについても同様。 またFIRST及びSECONDは初期化されていないので何が入っていても不思議はありません。 そのため、first, secondが20文字に満たない場合は先頭部分に入力した文字列以外の何かが入ります。 ちゃんと先頭から文字列分だけ入るようにしましょう。 #こっちはコード例は挙げません
その他の回答 (2)
- 正親町(@Ohgimachi)
- ベストアンサー率43% (110/252)
回答を記述中に#1の方とダブってしまいましたが 何も表示されない理由は以下の箇所にあります。 f=strlen(first); i=0; while (first[f]!='\0'){ FIRST[i]=first[19-i]; i++; } FIRST[20]='\0'; (1) 標準関数strlenは文字列の'\0'の位置を検索し、文字列の先頭からの相対アドレスを返します。 (2) そのため、while (first[f]!='\0') は常にFALSE(偽)となります。 (3) 従ってwhileのブロックは実行されません。 (4) whileのブロック、FIRST[i]=first[19-i];も間違っています。 for (f = strlen(first), i = 0; f > 0; FIRST[i++]=first[--f]); FIRST[i] = '\0'; と書けばよいのです。 あと、回答ではないのですが全体的に無駄な処理やメモリの使用が多すぎます。また標準入力がコンソール以外の場合にも対処していません。 先頭の入力の箇所は、以下の例のようにすればすっきりするでしょう。動作の解説はしませんから、自分で考えてみてください。他の有意義な指摘は#2のAsanoNagiさんのおっしゃるとおりです。 const char Input_messege[] ="Input your %s name (max 20 letters)"; const char Input_name_char[2] = {"last", "first"}; char *Input_letters[2]; Input_letters[0] = SECOND; Input_letter[1] = FIRST; for (i = 1 ; i >= 0; i--) { char *name_ptr, name_letter[21]; *(name_ptr = Input_letter[i]) = '\0'; //名前の入力。文字列の入力に成功するまで繰り返す。 { int cont; do { printf(Input_messege, Input_name_char[i]) if ((cont = scanf("%20s", name_letter)) == EOF) goto InputError; } while (cont != 1); } //文字のコピー { int name_len; name_len = strlen(name_letter); do { *name_ptr++ = name_letter[--name_len]; } while (name_len > 0); } *name_ptr = '\0'; //不要な文字の読み捨て ( int c; while ((c = getchar()) != '\n') if (c == EOF) break; } } InputError:
お礼
回答ありがとうございます。
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
最大の原因は、誰かが書いたか以前使ったかという、似たような問題の答えをそのまま貼り付けていることでしょう。 FIRST[i]=first[19-i]; というコードと、f=strlen(first); というコードは明らかに別の問題から引っ張ってきたコードです。 また、FIRST[20]='\0'; というコードがなぜ必要なのかわかりますか? (なぜ、20なのかとか) 既に正しい回答は付いていますが、あとは、 first = 'N' 'a' 'm' 'e' '\0' とか、紙に書いて FIRST = 'e' 'm' 'a' 'N' '\0' に入れ替えるには、「何番目を何番目に持って行ったらいいか」と、「文字の長さが変わったときに、それはどういう影響を受けるか」を考えるのが良いと思います。 あと、本題とは直接関係ありませんが、first と FIRST という安易な名前の付け方は、好ましくありません。 どちらが、最終結果なのか、一目でわかりますか? 大文字が最終結果というのもありですが、result は小文字ですし。 char first_input[21]; char first_result[21]; とか、意味を反映させた変数名が好ましいです。 もう少し進んで構造体を使えるようになったら、 struct namePairType { char first[21]; char last[21]; }; struct namePairType input, result; という書き方も良いと思います。 最後におまけ。 文字列の連結は、(特に指定がない限り)sprintf を使うのが簡単です。 strcpy(result,SECOND); strcat(result,FIRST); は、 sprintf(result, "%s %s", SECOND, FIRST); だけで済みます(間にスペースも入れました) そもそも、最終結果を単に表示するだけでよいのなら、 printf("Result:%s %s\n", SECOND, FIRST); も良いかと思います。
お礼
回答ありがとうございます。
お礼
回答ありがとうございます。