2013-06-24 3 views
0

Я пытаюсь использовать массив структур для хранения информации из 5 книг. Я читал книгу, которая довольно распространена на индийском субконтиненте, т.е. «Давайте C», чтобы понять, что является C, так что я готов к изучению K & R.While я пытался реализовать один из примеров для массива структур, я делаю необходимые изменения в примере, но все же я получаю определенные ошибки, и я не могу найти ошибка.Массив структур, не в состоянии использовать

#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 Ошибка придет «Формат с плавающей запятой не связан»

Я видел An array of structures и другие связанные вопросы о stackoverflow, но не могу решить, какую ошибку у меня возникает в моем коде.

+0

ссылку на массив символов? Никогда не видел этого, я думаю, что люди используют char * вместо того, чтобы C рассматривал массивы как указатели на их первый элемент. Почему вы добавляете символ «&»? Согласно scanf doc это не требуется для char []. http://www.cplusplus.com/reference/cstdio/scanf/. – Ricola3D

+0

Некоторые лекции о ссылках и массивах здесь: stackoverflow.com/questions/1106957/pass-array-by-reference-in-c – Ricola3D

+0

@ Ricola3D: В соответствии с предложениями я удалил «&», но все равно получал ту же ошибку – shailendra

ответ

1

Когда вы читаете строки в scanf, вам не нужно использовать символ «&».

3

Проблема в том, что %s в scanf читается только до первого символа пробела. Таким образом, вы не можете прочитать let us C, используя этот подход, потому что он остановится после чтения let.

И наконец, символ & используется для получения адреса переменной. При чтении в векторы вам не нужно это перед именем вектора, так как он уже распался на указатель.

0

Имя массива - это указатель на первый элемент массива. Оператор адреса не должен применяться к массивам символов в инструкции scanf.

scanf("%s %s %d %d", b[i].bookname, b[i].authorname, &b[i].price, &b[i].book_id); 
         ^^^   ^^^ 
0

Вы с видом warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char (*)[30]’ параметр .Make как символ * в строке вызывающей зсапЕ.

0

Вы не должны передавать адрес указателя в этом случае с scanf. Используйте scanf без &. Кроме того, нехорошо использовать scanf для чтения строки, поскольку, когда появляется пробел, он перестает читать. Поэтому, когда вы вводите «Let C», здесь появляется пустое пространство Let, так что это не работает. Лучшим вариантом является использование gets, который может быть полезен здесь. См. reference documentation из gets для более подробной информации.

Надеюсь, это поможет.

0

По словам других, у вас есть 2 ошибки:

  1. используется зсапЕ, который не читал до первого белого пробела вместо 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

Смежные вопросы