- ベストアンサー
C言語で文字列配列から姓と名を表示する方法
- C言語の入門で文字列配列から姓と名を表示する方法についての質問です。
- 質問者はアンダースコアを使って姓と名を区切り、3つの表示方法を試みています。
- しかし、名の後ろに変な漢字が入ってしまう問題が発生しています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
そのコードではx[30]の一番後ろにある'\0'の位置(index)がqに入ってしまいます。 (最初の'\0'より後ろはゴミが入っているのでqの値も無意味。) 最初の'\0'を検出した時点でループをbreakを使うなどして抜けてください。 なお、'\0'終端の文字列が入っているとわかっているならループの終了条件自体を'\0'の検出にすることが多いと思います。 あと、うまくいってないと思うのならその部分にprintfを入れるなどして 自分の期待通りの動作をしているか確認してみましょう。 > if(x[i]=='\0') q=i; //ヌルコードの検出 の部分でqの値を出力するだけでもかなりの手がかりが得られるはずです。
その他の回答 (2)
とりあえず char x[30], a; は char x[30] = {0}, a; //={0}で配列の内部を全部0で初期化 としてみるとある程度答えに近づけるかもしれません。
#include <stdio.h> int main(){ char str[ 80 ] = {0}; scanf("%s", str ); puts("\n出力結果:"); // そのままで表示 puts( str ); // _を空白に変えて表示 for ( int i = 0; str[ i ]; i++ ) { if ( str[ i ] == '_' ) printf(" "); else putchar( str[ i ] ); } puts(""); // 逆順で表示 int Start = 0; for ( int i = 0; str[ i ]; i++ ) //アンダーバーの位置を得る { if ( str[ i ] == '_' ) Start = i; } for ( int i = Start + 1; str[ i ]; i++ ) //アンダーバーの位置から描画 { putchar( str[i] ); } printf(" "); for ( int i = 0; i < Start; i++ ) //アンダーバーの位置まで描画 { putchar( str[i] ); } } コードが読みにくかったので自分で考えてみましたがこんな感じでどうでしょう?
お礼
ご回答ありがとうございます。教えていただいたように、最初の'\0'をみつけたらループを抜けるようにしたら解決しました。 わかりやすい解説ありがとうございました。 たすかりました。