• ベストアンサー

文字列の入力

文字列(名前)と誕生日を読み込み、表示するプログラムです。文字列を読み込むときに空行を入力すると、読み込みを終了して表示するようにしたのですが、うまくいきません。読み込む時に使う関数が違うのだと思います。scanfとgets、fgetsは試したのですが、だめでした。 教えてください。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define DATA 3 int main() { char *name[DATA]; char work[31]; int month[DATA]; int day[DATA]; int count1,count2; printf("Data #1\n"); printf("name ="); fgets(work,31,stdin); for(count1=0;(work[0]!='\n')&&(count1<DATA);count1++){ printf("month ="); scanf("%d",&month[count1]); printf("day ="); scanf("%d",&day[count1]); name[count1]=(char *)malloc((strlen(work)+1)*sizeof(char)); strcpy(*(name+count1),work); printf("\n"); if(count1<DATA-1){ printf("Data #%d\n",count1+2); printf("name ="); fgets(work,31,stdin); } } for(count2=0;(count2<DATA)&&(count2<count1);count2++){ printf("Data #%d\n",count2+1); printf(" name: %s\n",*(name+count2)); printf(" birthday: %2d %2d\n",month[count2],day[count2]); } }

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

  • ベストアンサー
  • mi-si
  • ベストアンサー率35% (200/567)
回答No.3

標準入力で、系列の違う関数を組み合わせて使うと動作が予測できなくなるのでgetchar()で一文字ずつ取り込んで、自前でパースする関数を作って処理した方が良いと思われます。

StudentYuta
質問者

補足

ありがとうございます。 getchar()を使うと改行文字は読み込めますか?

その他の回答 (3)

  • HOGERA3
  • ベストアンサー率35% (50/139)
回答No.4

#2です。 >getchar()を使うと改行文字は読み込めますか? はい、読み込めます。

  • HOGERA3
  • ベストアンサー率35% (50/139)
回答No.2

>scanfとgets、fgetsは試したのですが、だめでした。 どう試して、どうだめだったのかを言ってくれないと 回答のしようがありません。 やりたいことはこういうこと↓ですか? #include <stdio.h> #include <stdlib.h> /* atoi() */ #include <string.h> /* strcpy() */ #define BUFF_LEN 64 #define DATA 3 int main(void) {   char buff[BUFF_LEN];   int i;   for (i = 0; i < DATA; ++i) {     char name[BUFF_LEN];     int month, day;     printf("name = ");     fgets(buff, BUFF_LEN, stdin);     strcpy(name, buff);     printf("month = ");     fgets(buff, BUFF_LEN, stdin);     month = atoi(buff);     printf("day = ");     fgets(buff, BUFF_LEN, stdin);     day = atoi(buff);     printf("\nData #%d\n name: %s birthday: %2d %2d\n",       i + 1, name, month, day);   }   return 0; }

noname#74310
noname#74310
回答No.1

ソースを見る気がないのでコメントですが c#またはCBuilder体験版を使用することをお勧めします。