如何创建一个使用指针ptr来读取和打印有关书籍结构的程序的程序?

时间:2019-05-25 14:59:48

标签: c pointers struct

如何拥有一个使用指针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;
}

我希望程序阅读一本书的这四件事,然后仅使用指针ptr

将它们打印在最终的printf中。

2 个答案:

答案 0 :(得分:1)

您必须先分配内存。

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

也不要使用函数gets。它已被删除。 Read here why it is dangerous

此外,对gets的呼叫是错误的。参数应为ptr->title。而是改用它:

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

并始终检查scanf的返回值,以确保一切正常。

答案 1 :(得分:1)

您有几个问题

  • 您错过了分配您的 book

  • 实例
  • &ptr->title[100]无效

  • gets 的使用自多年以来已被弃用,请使用 fgets 限制大小并避免未定义的行为

  • 您错过了检查您的 scanf 返回1以了解是否已完成有效输入的操作

  • 由于没有 free malloc 而导致内存泄漏,实际上您不需要在堆中分配书

  • 您确定对于作者来说,一个字符就足够了吗?可能你想要一个数组

  • gets(&ptr->authors);无效,因为 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 $