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

解決済みの質問

2次元配列

課題で、氏名をローマ字で入力し、2次元配列に格納するプログラムを作成するというのがでました。条件として、氏名の長さは10文字以下、最大件数は10件。1エントリ入力ごとに累計件数を表示し、10件目の入力が完了するか、氏名の一文字目に'0'が入力されたら入力を終了しデータを表示する。11文字以上入力されたら、先頭から10文字までを有効とし、11文字目以降を無視する。
改行のみの入力の場合、エラーメッセージを表示し、再入力させる。
初心者の私には、データの表示と、条件の処理の仕方がわかりません。
下記プログラムを上記の条件を満たすようにするには、どこを直したらよいか教えてください。
お願いします。
#include <stdio.h>
#include <string.h>


#define BUFFERSIZE 1024

main()
{
char str[10][BUFFERSIZE];
char c;
int count = 0;
int i;
int j;
int l[10];

/*氏名の入力*/

for (i = 0; i < 10; i++) {
printf("氏名人力 : ");

while ( (c = getchar()) != '\n' ) {
if( count < BUFFERSIZE - 1 ){
str[i][count++] = c;
}
}
str[i][count] = '\0';

printf("累計 : %d \n", i+1);
}

for (i = 0; i < 10; i++) {
for (j = 0; j < 10; j++) {

printf("%c",str[i][j]);

}

putchar('\n');
}
return 0;

}

投稿日時 - 2006-12-20 17:13:03

QNo.2614793

すぐに回答ほしいです

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

★アドバイス
・『getchar』関数は改行が入力されるまで制御が戻りません。
・よって『fgets』関数で文字列として入力(取得)します。
・改行のみの入力は、文字列の最初が '\n' になるのでエラーメッセージを表示します。
・文字列で取得したら str[i] の領域に最大 10 文字までをコピーします。
・あと、getchar 関数は -1 を返しますので int 型で c を宣言します。
・文字列の最初が '0' ならば入力を終了します。→『break』命令で while 文を抜けます。
・表示部分は大体あっていますね。→printf を使えばもっと楽です。

●サンプル
int main()
{
 char tmp[BUFFERSIZE]; ←追加
 char str[10][11]; ←11で十分
 int count = 0;
 int i;
 int j;
 int l[10]; ←いらないよ
 
 for ( i = 0 ; i < 10 ; i++ ){
  printf("氏名入力 : "); ←タイプ・ミス!
  
  while ( fgets(tmp,sizeof(tmp),stdin) != NULL ){ ←文字列で入力
   if ( tmp[0] == '\n' ){ ←改行のみの入力
    printf( "エラーメッセージを表示\n" );
    continue; ←再入力
   }
   if ( tmp[0] == '0' ){ ←入力を終了
    goto input_end;
   }
   for ( count = 0 ; count < 10 ; count++ ){ ←先頭から10文字までを有効
    if ( tmp[count] == '\n' ){ ←なぜか分かりますか?
     break;
    }
    str[ i ][ count ] = tmp[ count ];
   }
   str[ i ][ count ] = '\0';
   break;
  }
  printf("累計 : %d \n", (i + 1) );
 }
input_end:
 for ( j = 0 ; j < i ; j++ ){ ←入力数のみ表示
  printf( "%s\n", str[j] );
 }
 return( 0 );
}
最後に:
・データ入力部分、データ表示部分を分けて考えましょう。
・getchar、printf、fgets 関数の動作をきちんとお勉強しましょう。

投稿日時 - 2006-12-20 19:10:52

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

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

回答(2)

ANo.1

課題のまる振りはこのサイト駄目だと思いますよ。
まるふりじゃないみたいですけど。

なので一応ヒントです。

とりあえず スタック使い過ぎです!

char str[10][BUFFERSIZE];
これは外に出す、そもそも10文字指定があるなら1024も要らない。
そして初期化してください。

printf("氏名人力 : "); -> printf("氏名入力 : ");に直す!

11文字目を判断するには、
countで条件分岐。 countをどこかで初期化してください。

'0'の判断はgetchar()で受け取った値で条件分岐。

for (i = 0; i < 10; i++) {
for (j = 0; j < 10; j++) {

printf("%c",str[i][j]);

}

putchar('\n');
}

これは一文字ずつ出力しないで、%sを使用したほうが良い。

投稿日時 - 2006-12-20 18:49:09

あなたにオススメの質問