Масив структур, неможливо використати

I am trying to use array of structures to store the information of 5 books.I was reading a book that ia quite common in Indian sub-continent i.e. "Let us C" just to understand what is C so that i am uch prepare to study K&R.While i was trying to implement one of the example for array of structures, i make required changes in the example but still i am getting certain errors and i am unable to find the error.

#include

//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

Поряд з цим я не можу зрозуміти використання зміненої прив'язки, яка згідно з книгою використовується, коли ми використовуємо змінну float у нашому коді, і якщо вона не використовується при використанні змінної float, з'являється помилка "Формат плаваючої точки не пов'язаний "

Я бачив масив структур та інші пов'язані з ним питання в stackoverflow, але не можу вирішити, яку помилку я Я маю в своєму коді.

0
посилання на масив char Ніколи не бачив його, я думаю, що люди використовують символ *, оскільки C розглядає масиви як вказівник на їх перший елемент. Чому ви додаєте символ "&"? Відповідно до scanf doc це не обов'язково для char []. cplusplus.com/reference/cstdio/scanf .
додано Автор Ricola3D, джерело
Деякі лекції про посилання та масиви тут: stackoverflow.com/questions/1106957/pass-array-by-reference-‌ in-c
додано Автор Ricola3D, джерело
@ Ricola3D: за пропозиціями я видалив "&", але все одно отримував таку ж помилку
додано Автор shailendra, джерело

6 Відповіді

Проблема полягає в тому, що % s в scanf читається тільки до першого символу пробілу. Таким чином, ви не можете прочитати дайте нам C , використовуючи цей підхід, тому що він припиниться після прочитання let .

Finally, the & character is used to get the address of a variable. When reading into vectors you don't need it before the name of the vector since it has already decayed into a pointer.

3
додано

When you read strings in scanf you don't need to use "&" symbol.

1
додано

Ви з видом попередження: формат «% s» очікує типу «символ *», але аргумент 2 має тип «символ (*) [30]» параметр .Make як символ * в рядку викликає зсапЕ.

0
додано

Назва масиву - це вказівник на перший елемент масиву. Адресний оператор не слід застосовувати до масивів символів в операторі scanf.

   scanf("%s %s %d %d", b[i].bookname, b[i].authorname, &b[i].price, &b[i].book_id);
                       ^^^            ^^^
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.

Я сподіваюсь, це допоможе.

0
додано

Як сказали інші, у вас є 2 помилки:

  1. You use scanf which read until the first white space character instead of fscaf which read until the end of the line.
  2. When passing CString or Arrays you don't need you use the '&' character since the literal of the variable b[i] in you case is already decayed to a pointer.

Ваш код читання має бути таким:

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);
}

You can check the whole source on cfiddle: http://cfiddle.net/oZvbRm

0
додано