У вас есть несколько проблем
вы пропустили выделение своего экземпляра book
&ptr->title[100]
недействительно
использование получает устарело с годами, используйте fgets , чтобы ограничить размер и избежать неопределенного поведения
вы пропустили проверку scanf , верните 1, чтобы узнать, был ли введен правильный ввод
у вас утечка памяти из-за malloc без free , и на самом деле вам не нужно выделять свою книгу в куче
Вы уверены, что для авторов достаточно только символа? вероятно, вы хотели массив
gets(&ptr->authors);
недопустимо, потому что авторы это просто символ
формат "% s" для авторов недопустим, потому что это просто символ
вы пропустили% до "lf", чтобы напечатать цену
Возможно, вам не нужен перевод строки во входной строке
Вы хотели что-то вроде:
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
struct book {
char title[100];
char authors[100];
int code;
double prc;
};
int main(void) {
struct book * ptr = malloc(sizeof(struct book));
size_t len;
printf("Title:\n");
if (fgets(ptr->title, sizeof(ptr->title), stdin) == NULL)
/* EOF */
return -1; /* or an other behavior is you want */
len = strlen(ptr->title);
if (ptr->title[len - 1] == '\n')
ptr->title[len - 1] = 0;
printf("authors:\n");
if (fgets(ptr->authors, sizeof(ptr->authors), stdin) == NULL)
/* EOF */
return -1;/* or an other behavior is you want */
len = strlen(ptr->authors);
if (ptr->authors[len - 1] == '\n')
ptr->authors[len - 1] = 0;
printf("code:\n");
if (scanf("%d",&ptr->code) != 1) {
puts("invalid code");
return 1; /* or an other behavior is you want */
}
printf("Price:\n");
if (scanf("%lf",&ptr->prc) != 1) {
puts("invalid price");
return 1; /* or an other behavior is you want */
}
printf("T:%s,A:%s,C:%d,P:%lf\n",ptr->title,ptr->authors,ptr->code,ptr->prc);
free(ptr);
return 0;
}
или без выделения книги в куче:
#include<stdio.h>
#include <string.h>
struct book {
char title[100];
char authors[100];
int code;
double prc;
};
int main(void) {
struct book b;
size_t len;
printf("Title:\n");
if (fgets(b.title, sizeof(b.title), stdin) == NULL)
/* EOF */
return -1; /* or an other behavior is you want */
len = strlen(b.title);
if (b.title[len - 1] == '\n')
b.title[len - 1] = 0;
printf("authors:\n");
if (fgets(b.authors, sizeof(b.authors), stdin) == NULL)
/* EOF */
return -1;/* or an other behavior is you want */
len = strlen(b.authors);
if (b.authors[len - 1] == '\n')
b.authors[len - 1] = 0;
printf("code:\n");
if (scanf("%d",&b.code) != 1) {
puts("invalid code");
return 1; /* or an other behavior is you want */
}
printf("Price:\n");
if (scanf("%lf",&b.prc) != 1) {
puts("invalid price");
return 1; /* or an other behavior is you want */
}
printf("T:%s,A:%s,C:%d,P:%lf\n",b.title,b.authors,b.code,b.prc);
return 0;
}
Компиляция и исполнение:
pi@raspberrypi:/tmp $ gcc -pedantic -Wall -Wextra c.c
pi@raspberrypi:/tmp $ ./a.out
Title:
the mirific title
authors:
me
code:
007
Price:
12.34
T:the mirific title,A:me,C:7,P:12.340000
pi@raspberrypi:/tmp $