こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

文字表示の問

 学校でC言語の入門をやっています。今回の問題は、30文字分の配列を用意してから、「Suzuki_Ichiro」のように、ローマ字で姓と名の間にアンダースコアを入れた文字列を入力し、(1)そのまま表示、(2)アンダースコアなしで姓と名の間は空白で表示 「Suzuki Ichiro」、(3)姓と名を逆順に(姓と名の間は空白)表示 「Ichiro Suzuki」 というものです。
 下は自分が考えたプログラムです。(左の番号は行番号で実際は入力していません)

#include<stdio.h>
3 void main()
4 {
5 char x[30],a;   //30文字分の配列を用意
6 int i,p,q;
7
8 gets(x);     //文字列の入力指示
9
10 puts(x);     //文字列の表示(上の(1))
11
12 for(i=0;i<30;i++)
13 {
14
15 if(x[i]=='_') p=i;  //アンダースコアの検出
16 if(x[i]=='\0') q=i;  //ヌルコードの検出
17
18 }
19
20 for(i=0;i<p;i++)
21 {
22 putchar(x[i]);  //最初の文字からアンダースコ                   アの1文字前まで表示
23
24 }
25
26 printf(" ");     //空白の表示
27
28 for(i=p+1;i<q;i++)
29 {
30 putchar(x[i]);  //アンダースコアの1文字後か                   らヌルコードの前まで表示
31                (上の(2))
32 }
33
34 printf("\n");
35
36 for(i=p+1;i<q;i++)
37 {
38 putchar(x[i]);  //同様に「名」の表示
39 }
40
41 printf(" ");     //空白の表示
42
43 for(i=0;i<p;i++)
44 {
45 putchar(x[i]);  //「姓」の表示(上の(3))
46 }
47
48 printf("\n");
49
50 }


 以上です。このプログラムで実行すると、下のようになります。

Suzuki_Ichiro →(1)
Suzuki Ichiro崇    →(2)
Ichiro崇 Suzuki    →(3)

 名の後ろに変な漢字が入ってしまうのです。原因は、
 if(x[i]=='\0') q=i;  //ヌルコードの検出
のところでヌルコードの位置がちゃんと読み込めてないと考えています。本来なら、ヌルコード(\0)はIchiroの「o」の1文字後につくはずですが、ヌルコードが「o」のずっと後ろになってしまっているような気がします。

 どうすれば、うまくいくでしょうか。よろしくお願いします。

投稿日時 - 2007-12-29 12:53:37

QNo.3635896

すぐに回答ほしいです

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

そのコードではx[30]の一番後ろにある'\0'の位置(index)がqに入ってしまいます。
(最初の'\0'より後ろはゴミが入っているのでqの値も無意味。)
最初の'\0'を検出した時点でループをbreakを使うなどして抜けてください。

なお、'\0'終端の文字列が入っているとわかっているならループの終了条件自体を'\0'の検出にすることが多いと思います。


あと、うまくいってないと思うのならその部分にprintfを入れるなどして
自分の期待通りの動作をしているか確認してみましょう。
> if(x[i]=='\0') q=i;  //ヌルコードの検出
の部分でqの値を出力するだけでもかなりの手がかりが得られるはずです。

投稿日時 - 2007-12-29 13:42:50

お礼

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

投稿日時 - 2007-12-29 18:16:44

ANo.2

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

とりあえず
char x[30], a;

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

投稿日時 - 2007-12-29 13:48:14

ANo.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] );
}
}

コードが読みにくかったので自分で考えてみましたがこんな感じでどうでしょう?

投稿日時 - 2007-12-29 13:39:09

あなたにオススメの質問