Как получить программу, которая использует указатель ptr для чтения и печати материала о структуре книги? - PullRequest
0 голосов
/ 25 мая 2019

Как получить программу, которая использует указатель ptr для чтения и печати материала о структуре книги без использования какой-либо другой переменной.Для доступа к содержимому структуры я должен использовать -> Моя программа завершает работу после первого чтения.Может ли кто-нибудь предоставить мне код?Вот мой код:

#include<stdio.h>

struct book {
    char title[100];
    char authors;
    int code;
    double prc;
};

int main(void) {
    struct book *ptr;
    printf("Title:\n");
    gets(&ptr->title[100]);
    printf("authors:\n");
    gets(&ptr->authors);
    printf("code:\n");
    scanf("%d",&ptr->code);
    printf("Price:\n");
    scanf("%lf",&ptr->prc);

    printf("T:%s,A:%s,C:%d,P:lf\n",ptr->title,ptr->authors,ptr->code,ptr->prc);
    return 0;
}

Я ожидаю, что программа прочитает эти 4 вещи о книге, а затем напечатает их в конечном файле printf, используя только указатель ptr

Ответы [ 2 ]

1 голос
/ 25 мая 2019

У вас есть несколько проблем

  • вы пропустили выделение своего экземпляра 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 $ 
1 голос
/ 25 мая 2019

Сначала нужно выделить память.

struct book *ptr = malloc(sizeof (*ptr));

Кроме того, никогда не используйте функцию gets.Это было удалено. Прочтите здесь, почему это опасно

Кроме того, звонок на gets неправильный.Аргумент должен быть ptr->title.Но используйте вместо этого:

fgets(ptr->title, 100, stdin);

И всегда проверяйте возвращаемое значение из scanf, чтобы убедиться, что все прошло нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...