Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用cycle for和scanf填充我的结构数组中的每个结构?_C_Arrays_For Loop_Structure - Fatal编程技术网

如何用cycle for和scanf填充我的结构数组中的每个结构?

如何用cycle for和scanf填充我的结构数组中的每个结构?,c,arrays,for-loop,structure,C,Arrays,For Loop,Structure,我是这个网站的新手,它看起来很酷 我有一个问题,我想做一个程序,让用户决定要申报多少本书,然后用户填写每本书的信息(例如:用户想要3本书,所以他填写这3本书的所有信息) 我想我需要一个数组结构,但我不知道如何循环这个填充过程 这是我的代码: struct book { char bname[20]; int pages; char author[20]; long price; }; printf("enter number of books to s

我是这个网站的新手,它看起来很酷

我有一个问题,我想做一个程序,让用户决定要申报多少本书,然后用户填写每本书的信息(例如:用户想要3本书,所以他填写这3本书的所有信息)

我想我需要一个数组结构,但我不知道如何循环这个填充过程

这是我的代码:

struct book
    {
    char bname[20];
    int pages;
    char author[20];
    long price; 
};

printf("enter number of books to store");
scanf("%d",&unumber);
for (i=0;i<number_of_books;i++) {printf's and scanf's to fill each struct}
struct book
{
char bname[20];
整版;
char作者[20];
多头价格;
};
printf(“输入要存储的图书数量”);
scanf(“%d”,和unumber);

对于(i=0;i有两种方法。一种是简单地使用书籍结构数组,另一种是使用链表。下面,我将为您提供两种解决方案:

第一个使用结构数组的解决方案:

#include <stdio.h>
#include <stdlib.h>

#define MAXBOOKS 100

struct book {
     char bname[20];
     int pages;
     char author[20];
     long price;
};

int main()
{
     struct book books[MAXBOOKS];
     int number_of_books;
     printf("enter number of books to store\n");
     scanf("%d",&number_of_books);

     // writing books
     for (int i=0;i<number_of_books;i++) {
            printf("Enter new book record: Book_Name, Pages, Author, Price\n");
            scanf("%s %d %s %ld",books[i].bname, &books[i].pages, books[i].author, &books[i].price);

     }


     //reading books
     printf("Entered books records: Book_Name, Pages, Author, Price\n");
     for (int i=0;i<number_of_books;i++) {
            printf("%s\t %d\t %s\t %ld\n",books[i].bname, books[i].pages, books[i].author, books[i].price);

     }

     return 0;
 }
$ ./bin/books

Enter number of books to store: 2

  book[ 1] name  : Tom Sawyer
  book[ 1] pages : 321
  book[ 1] author: Mark Twain
  book[ 1] price : 2199

  book[ 2] name  : Huckelberry Finn
  book[ 2] pages : 298
  book[ 2] author: Mark Twain
  book[ 2] price : 1999


The Books Entered Were:

  Book 1   "Tom Sawyer"
    author : Mark Twain
    pages  : 321
    price  : 2199

  Book 2   "Huckelberry Finn"
    author : Mark Twain
    pages  : 298
    price  : 1999
#包括
#包括
#定义MAXBOOKS 100
结构书{
char bname[20];
整版;
char作者[20];
多头价格;
};
int main()
{
结构图书[马克斯图书];
书籍的整数;
printf(“输入要存储的图书数量\n”);
scanf(“%d”和图书数量);
//写书
对于(inti=0;作者,&temp->price);
temp->next=NULL;
if(head==NULL){
printf(“在头部,如有”);
压头=温度;
curnode=temp;
}否则{
curnode->next=temp;
curnode=curnode->next;
}
}
//读书
温度=水头;
while(temp!=NULL){
printf(“%s\t%d\t%s\t%ld”,临时->名称,临时->页面,临时->作者,临时->价格);
printf(“\n”);
温度=温度->下一步;
}
返回0;
}

在循环中读取输入时,一个主要的关注点是确保每次读取后刷新
stdin
,以防止尾随的
换行符被解释为下一个
read
语句的输入。但是,有很多方法可以做到这一点,使用
scanf
最简单的方法是小心使用尾随的
换行符
的精心编制的
格式
语句。以下说明了此方法:

#include <stdio.h>

#define MAXS 256

struct book
{
    char bname[20];
    int pages;
    char author[20];
    long price; 
};

int main () {

    struct book books[MAXS] = {{ {0}, 0, {0}, 0 }}; /* initialize all values to zero (null) */
    int nbooks = 0;
    int i = 0;

    printf ("\nEnter number of books to store: ");
    scanf("%d%*c",&nbooks);                         /* read nbooks, and consume newline     */

    if (nbooks < 1) {                               /* validate number of books to enter    */
        fprintf (stderr, "error: invalid entry for 'nbooks'\n");
        return 1;
    }

    for (i = 0; i < nbooks; i++)                    /* enter values for each book, use      */
    {                                               /* scanf to read each value AND the     */
        printf ("\n  book[%2d] name  : ", i + 1);   /* newline character, emptying stdin    */
        scanf ("%[^\n]%*c", books[i].bname);        /* after each read.                     */
        printf ("  book[%2d] pages : ", i + 1);
        scanf ("%d%*c", &books[i].pages);
        printf ("  book[%2d] author: ", i + 1);
        scanf ("%[^\n]%*c", books[i].author);
        printf ("  book[%2d] price : ", i + 1);
        scanf ("%ld%*c", &books[i].price);
    }

    printf ("\n\nThe Books Entered Were:\n");       /* output info for each book entered    */
    i = 0;
    while (*books[i].bname)
    {
        printf ("\n  Book %-3d \"%s\"\n", i + 1, books[i].bname);
        printf ("    author : %s\n", books[i].author);
        printf ("    pages  : %d\n", books[i].pages);
        printf ("    price  : %ld\n", books[i].price);
        i++;
    }

    printf ("\n");

    return 0;
}

如果书名中有空格,
scanf(“%s%d%s%d”,temp->bname…
将不起作用。@kriyeta我正试图运行您的代码,但它返回了一个错误,mallocs声明可以吗?引入一个抽象的数据结构,而不是问题所要求的,从而使简单问题的答案复杂化是不明智的。这只会增加不必要的混乱。@Jey我修改了代码,它是ru现在进行nning。您也可以使用结构数组进行此操作。
$ ./bin/books

Enter number of books to store: 2

  book[ 1] name  : Tom Sawyer
  book[ 1] pages : 321
  book[ 1] author: Mark Twain
  book[ 1] price : 2199

  book[ 2] name  : Huckelberry Finn
  book[ 2] pages : 298
  book[ 2] author: Mark Twain
  book[ 2] price : 1999


The Books Entered Were:

  Book 1   "Tom Sawyer"
    author : Mark Twain
    pages  : 321
    price  : 2199

  Book 2   "Huckelberry Finn"
    author : Mark Twain
    pages  : 298
    price  : 1999