0

我正在尝试使用结构数组来存储 5 本书的信息。我正在阅读一本在印度次大陆很常见的书,即“让我们 C”只是为了了解什么是 C,以便我准备好学习K&R.虽然我试图实现结构数组的示例之一,但我在示例中进行了必要的更改,但我仍然遇到某些错误并且我无法找到错误。

#include<stdio.h>

//void inkfloat(); commented as i am not using any float variable
int main()
{
    int i;
    struct book
    { 
        char bookname[30];
        char authorname[30];
        int price;
        int book_id;
    };

    struct book b[5];

    for(i=0;i<=4;i++)
    {
        printf("Enter bookname,authorname, price and book_id for book");
        scanf("%s %s %d %d",&b[i].bookname,&b[i].authorname,&b[i].price,&b[i].book_id);
    }

    for(i=0;i<=4;i++)
    {
        printf(" %s  %s  %d  %d \n",b[i].bookname,b[i].authorname,b[i].price,b[i].book_id); 
    }

    return 0;
}

/*void inkfloat()
  {
  float a=0,*b;
  b=&a;
  a=*b;
  }*/

我得到的输出为

Enter bookname,authorname, price and book_id for book shailendra
Enter bookname,authorname, price and book_id for book let us c
Enter bookname,authorname, price and book_id for bookEnter bookname,authorname, price and book_id for bookEnter bookname,authorname, price and book_id for bookyaswat kanetkar
 s, �, -1218811592, -1216872840 l, :, -1218241152, -1218240426 u, ~, -1216874216, 0 c, �, 134513259, 0 y, , -1218653802, -1217138700

除此之外,我无法理解inkfloat变量的使用,根据本书,当我们在代码中使用float变量时使用它,如果在使用float变量时没有使用它,则会出现错误“浮点格式未链接"

我在 stackoverflow 上看到了一系列结构和其他相关问题,但无法解决我在代码中遇到的错误。

4

6 回答 6

3

问题是%sinscanf只读取到第一个空白字符。因此,您无法let us C使用这种方法阅读,因为它会在阅读后停止let

最后,该&字符用于获取变量的地址。读入向量时,您不需要在向量名称之前使用它,因为它已经衰减为指针。

于 2013-06-24T11:03:38.307 回答
1

当您在 scanf 中读取字符串时,您不需要使用“&”符号。

于 2013-06-24T11:03:29.180 回答
0

正如其他人所说,您有两个错误:

  1. 您使用 scanf 读取到第一个空白字符而不是 fscaf 读取到行尾。
  2. 传递 CString 或数组时,您不需要使用“&”字符,因为在您的情况下变量 b[i] 的文字已经衰减为指针。

你的阅读代码应该是这样的:

for(i=0;i<5;i++)
{
    printf("Enter bookname,authorname, price and book_id for book");
    fgets(b[i].bookname,30,stdin);
    fgets(b[i].authorname,30,stdin);
    scanf("%d %d",&b[i].price,&b[i].book_id);
}

您可以在 cfiddle 上查看整个源代码:http: //cfiddle.net/oZvbRm

于 2013-06-24T21:34:44.773 回答
0

You are not supposed to pass address of pointer in this case with scanf. Use scanf without &. Moreover, it's not good to use scanf for reading string since when a blank space character appears it stops reading. So when you input "Let us C", here there's blank space after Let so it doesn't work. A better option is to use gets that can be useful here. See reference documentation of gets for more details.

I hope this helps.

于 2013-06-24T11:21:13.723 回答
0

数组名是指向数组中第一个元素的指针。地址运算符不应应用于 scanf 语句中的字符数组。

   scanf("%s %s %d %d", b[i].bookname, b[i].authorname, &b[i].price, &b[i].book_id);
                       ^^^            ^^^
于 2013-06-24T11:06:03.177 回答
0
于 2013-06-24T11:07:21.963 回答