解決:
#include <stdio.h> /* Using fgets(), scanf(), printf() in this program */
#include <string.h> /* Using strlen() in this program */
int main()
{
struct books
{
char name[100],author[100];
int year,copies;
}book1,book2;
char c;
char read_new_line;
printf("Enter details of first book\n");
if (fgets(book1.name, sizeof(book1.name), stdin) == NULL)
{
fprintf(stderr, "error reading name of book 1\n");
return -1;
}
/* Strip out \n character added by fgets */
book1.name[strlen(book1.name) - 1] ='\0';
if (fgets(book1.author, sizeof(book1.author), stdin) == NULL)
{
fprintf(stderr, "error reading author of book 1\n");
return -1;
}
/* Strip out \n character added by fgets */
book1.author[strlen(book1.author) - 1] ='\0';
scanf("%d %d",&book1.year,&book1.copies);
/* Strip out \n character left out in input stream */
while ((read_new_line = getchar()) != EOF && read_new_line != '\n')
;
printf("Enter details for second book\n");
if (fgets(book2.name, sizeof(book2.name), stdin) == NULL)
{
fprintf(stderr, "error reading name of book 2\n");
return -1;
}
/* Strip out \n character added by fgets */
book2.name[strlen(book2.name) -1 ] = '\0';
if (fgets(book2.author, sizeof(book2.author), stdin) == NULL)
{
fprintf(stderr, "error reading author of book 2\n");
return -1;
}
/* Strip out \n character added by fgets */
book2.author[strlen(book2.author) - 1] ='\0';
scanf("%d %d",&book2.year,&book2.copies);
/* Strip out \n character left out in input stream */
while((c = getchar()) != '\n' && c != EOF)
;
printf("%s\n%s\n%d\n%d\n",book1.name,book1.author,book1.year,book1.copies);
printf("%s\n%s\n%d\n%d\n",book2.name,book2.author,book2.year,book2.copies);
return 0;
}
質問に投稿されたコードに関する観察:
コードが機能しない理由を理解してみましょう。
以下のステートメントから scanf を呼び出した後
scanf("%d%d",&book1.year,&book1.copies);
あなたの入力は
3432\n
23\n
scanf
を読み込んで3432
に格納し&book1.year
、次\n
は入力ストリームで除外されます。次に、2 番目%d
は先頭の空白 (このコンテキストの空白にはスペース、タブ、改行などが含まれます) を破棄し、それを読み取って23
に保存し&book1.copies
ます\n
。
gets(book2.name)
入力ストリームでが呼び出された場合、条件に\n
一致するgets()
ため、「空の文字列」が割り当てられbook2.name
、意味するものと提供されたユーザー入力book2.name
が に保存されbook2.author
ます。
適切な整数が入力されず、失敗したためbook2.author
、ユーザー入力が %d に割り当てられているため、その変換が行われ、失敗します。book2.year
scanf()
ノート :