C语言 为什么从另一个函数返回用户输入后,函数不启动

soat7uwm  于 2023-04-11  发布在  其他
关注(0)|答案(1)|浏览(101)

这是C中的代码:

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

typedef struct {
    char street;
    int number;
    char postalcode;
} Person;

void print(Person p) {
    printf("Street: %s\n", p.street);
    printf("Number: %d\n", p.number);
    printf("Postal code: %s\n", p.postalcode);
}

Person signUp() {
  Person person;

  printf("In which street do you live on?: \n");
  scanf("%s", &person.street);

  printf("What is your number?: \n");
  scanf("%d", &person.number);

  printf("what is your postal code?: \n");
  scanf("%s", &person.postalcode);

  return person;
 }

int main(void) {
  Person person;

  person = signUp();
    print(person); 

  return 0;
}

我尝试让“signUp”函数将用户输入返回给另一个名为“print”的函数,这样它就可以打印上一个函数的值。“signUp”函数工作得很好,但“print”函数永远不会启动。

6tdlim6h

6tdlim6h1#

1.你用%s阅读字符串,但你的变量是一个字符(格式为字符串%c)。
1.当使用scanf()阅读字符串时,总是使用最大字段宽度。我在这里使用str()宏来避免重复。注意:通常我们更喜欢使用sizeof(),但是你需要sizeof(p->street)-1,并且宏的求值顺序会妨碍你。
1.通过值传入结构并通过值返回它们没有什么错,但是,这意味着副本,所以我们通常通过指针来传递这些。

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

#define POSTALCODE_LEN 5
#define STREET_LEN 20
#define str(s) str2(s)
#define str2(s) #s

typedef struct {
    char street[STREET_LEN+1];
    int number;
    char postalcode[POSTALCODE_LEN+1];
} Person;

void print(const Person *p) {
    printf("Street: %s\n", p->street);
    printf("Number: %d\n", p->number);
    printf("Postal code: %s\n", p->postalcode);
}

void signUp(Person *person) {
    printf("In which street do you live on?: \n");
    scanf("%" str(STREET_LEN) "s", person->street);

    printf("What is your number?: \n");
    scanf("%d", &person->number);

    printf("what is your postal code?: \n");
    scanf("%" str(POSTALCODE_LEN) "s", person->postalcode);
}

int main(void) {
    Person person;
    signUp(&person);
    print(&person);
}

我意识到typedef让你不必写struct Person,但缺点是它将“Person”导入到与变量相同的名称空间中,所以你不能做Person Person,而必须使用小写的person。如果你需要和别人谈论你的代码,它会变得更加乏味“小写的人”或“个人大写的人”来区分。(双关语),我会使用一个简短的变量名来绕过它,即Person p
我还发现snake大小写比camel大小写更容易阅读(sign_up() vs signUp()),并且我发现命名空间规则更容易记住(常量是大写,rest是小写;使用camel case,它的方法以小写字母开始,然后大写字母,除了...等)。

相关问题