【问题标题】:Hard time printing struct members with a function很难打印具有功能的结构成员
【发布时间】:2016-11-20 06:36:44
【问题描述】:

我是 C 的新手,我正在研究这个基础项目,以帮助我解决问题......所以,如果我的代码看起来仍然有点愚蠢,请多多包涵。

话虽如此,我在使用打印结构成员的功能时遇到了问题。 我创建了一个函数来注册书籍详细信息,并创建了一个单独的函数来打印所述详细信息。

如果我在 registerBook 函数中打印详细信息,它们会正确打印。

但是,当我调用 printBook 方法时,我得到的只是“垃圾”。而且总是相同的字符,

代码如下:


#include <stdio.h>
#include <stdlib.h>

struct Books {
    char title[30];
    char author[20];
    int book_id[10];
    char subject[50];
} Books;

int main() {

    struct Books Book1;
    struct Books Book2;

    registerBook(Book1);
    printBook(Book1);
    registerBook(Book2);
    printBook(Book2);

    int exit = 0;
    while(exit == 0) {
        scanf("%p", exit);
    }

    return 0;
}

void printBook(struct Books a){
    printf("\nTitle: %s", a.title);
    printf("\nAuthor: %s", a.author);
    printf("\nISBN: %d", a.book_id);
    printf("\nSubject: %s", a.subject);
}

void registerBook(struct Books a){
    printf("\nTitle?");
    scanf("%s", &a.title);
    printf("\nAuthor?");
    scanf("%s", &a.author);
    printf("\nISBN?");
    scanf("%d", &a.book_id);
    printf("\nSubject?");
    scanf("%s", &a.subject);
}

我得到的是:


标题?一个

作者?二

ISBN?3

主题?四

标题:ç 作者:` ISBN:6356340 主题:Ç@ Title?five

作者?六

ISBN?7

主题?八

标题:&Ý=w¬8wÝ=wÃÊpï 作者:ISBN:6356340 主题:


有人可以建议吗?

【问题讨论】:

  • 从 registerBook 中的 scanf 函数中删除 &s。该函数需要一个与数组具有相同值的 char *。
  • 您好,感谢您的快速回复,奥尔登。不幸的是,对于 printBook(),它保持不变。
  • 谢谢,我试过了,但我仍然得到与输出相同的字符。例如,如果我在 registerBook(); 中打印 a.title,它会正确打印。但是当我尝试在 main 中 printf 时,它给出的“垃圾”与 printBook(); 完全相同。
  • 发布代码的第一部分,在函数之前:main() 既定义了一个结构又声明了该结构的一个实例(不幸的是,它使用与结构相同的名称。)结构的实例是完全不必要的,应该被删除。
  • 在传递参数时,传递整个结构体是一种非常糟糕的编程习惯。只需将指针传递给结构然后编写子函数以期望指向结构而不是整个结构的指针并访问结构的字段,离开该指针

标签: c function struct printf garbage


【解决方案1】:

在 registerBook 函数中,您应该通过引用而不是值传递参数,以便在函数结束后保留​​更改。

#include <stdio.h>
#include <stdlib.h>

struct Books {
    char title[30];
    char author[20];
    int book_id;
    char subject[50];
} Books;

void printBook(struct Books a){
    printf("\nTitle: %s", a.title);
    printf("\nAuthor: %s", a.author);
    printf("\nISBN: %d", a.book_id);
    printf("\nSubject: %s", a.subject);
}

void registerBook(struct Books* a){
    printf("\nTitle?");
    scanf(" %s", a->title);
    printf("\nAuthor?");
    scanf(" %s", a->author);
    printf("\nISBN?");
    scanf(" %d", &a->book_id);
    printf("\nSubject?");
    scanf(" %s", a->subject);
}



int main() {

    struct Books Book1;
    struct Books Book2;

    registerBook(&Book1);
    printBook(Book1);
    registerBook(&Book2);
    printBook(Book2);


    return 0;
}

我没有包含您的退出循环,因为它与您的问题无关。

【讨论】:

  • 谢谢,乔治·布!这解决了问题!现在我知道我做错了什么,那里。 :) 唯一仍然错误的是 book_id,无论我写什么,它总是返回相同的数字。
  • 哦,book_id 不能是数组 =X 我的错误。再次感谢!
猜你喜欢
  • 2011-12-19
  • 1970-01-01
  • 2021-11-22
  • 2012-08-30
  • 1970-01-01
  • 2013-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多