• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:文字表示の問)

C言語で文字列配列から姓と名を表示する方法

このQ&Aのポイント
  • C言語の入門で文字列配列から姓と名を表示する方法についての質問です。
  • 質問者はアンダースコアを使って姓と名を区切り、3つの表示方法を試みています。
  • しかし、名の後ろに変な漢字が入ってしまう問題が発生しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • Werner
  • ベストアンサー率53% (395/735)
回答No.2

そのコードではx[30]の一番後ろにある'\0'の位置(index)がqに入ってしまいます。 (最初の'\0'より後ろはゴミが入っているのでqの値も無意味。) 最初の'\0'を検出した時点でループをbreakを使うなどして抜けてください。 なお、'\0'終端の文字列が入っているとわかっているならループの終了条件自体を'\0'の検出にすることが多いと思います。 あと、うまくいってないと思うのならその部分にprintfを入れるなどして 自分の期待通りの動作をしているか確認してみましょう。 > if(x[i]=='\0') q=i;  //ヌルコードの検出 の部分でqの値を出力するだけでもかなりの手がかりが得られるはずです。

houdentaro
質問者

お礼

 ご回答ありがとうございます。教えていただいたように、最初の'\0'をみつけたらループを抜けるようにしたら解決しました。  わかりやすい解説ありがとうございました。  たすかりました。

その他の回答 (2)

noname#88356
noname#88356
回答No.3

とりあえず char x[30], a; は char x[30] = {0}, a; //={0}で配列の内部を全部0で初期化 としてみるとある程度答えに近づけるかもしれません。

noname#88356
noname#88356
回答No.1

#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] ); } } コードが読みにくかったので自分で考えてみましたがこんな感じでどうでしょう?

関連するQ&A