C中的结构和指针(将字符串分配给结构)

Posted

技术标签:

【中文标题】C中的结构和指针(将字符串分配给结构)【英文标题】:Struct and Pointer in C (Assigning string into struct) 【发布时间】:2021-04-29 10:17:49 【问题描述】:

我是 C 新手,目前正在研究指针和结构。但似乎我在为我的结构赋值时遇到了问题。

这是我的代码:

#include <stdio.h>

typedef struct

    char name[30];
    int age;
    int birth;

student;

void record(student *sp);

int main(void)

    student std1;
    record(&std1);
    
    printf("%i, %i %s\n", std1.birth, std1.age, std1.name);


void record(student *sp)

    printf("Name: ");
    scanf("%s", sp -> name);
    printf("Birth: ");
    scanf("%i", &sp -> birth);
    printf("Age: ");
    scanf("%i", &sp -> age);

运行程序:

./struct

Name: David Kohler

result: 

Birth: Age: 0, 0 David

我不明白的是,当我将 name 分配给 sp->name 时,它会立即打印出这样的意外结果。不提示输入年龄和出生。

但是当我这样跑的时候,它起作用了:

./struct
Name: Kohler
Birth: 1997
Age: 22

1997, 22 Kohler

那么,你们认为会发生什么?当我输入像 “David Kohler” 这样的全长名称而不是 “Kohler” 时,似乎不太好。

如果我想输入全名,有什么解决办法?我需要使用malloc吗?谢谢。

【问题讨论】:

阅读:***.com/questions/1247989/… 短版:***.com/a/1247993/898348 还有sp -&gt; name -> sp-&gt;name-&gt; 周围放置空格是非常不寻常的。 【参考方案1】:

格式说明符%s 跳过空格。您可以使用 fgets() 或修改您的 scanf() 格式说明符,正如 Jabberwocky 在 cmets 中指出的那样。

fgets:

void record(student *sp)

    printf("Name: ");
    fgets(sp->name,30,stdin);
    strtok(sp->name,"\n"); /* Removing newline character,include string.h */
    printf("Birth: ");
    scanf("%i", &sp -> birth);
    printf("Age: ");
    scanf("%i", &sp -> age);

请注意,使用 fgets 您还会在缓冲区中获得换行符。

扫描:

void record(student *sp)

    printf("Name: ");
    scanf("%29[^\n]", sp -> name); /* Added a characters limit so you dont overflow */
    printf("Birth: ");
    scanf("%i", &sp -> birth);
    printf("Age: ");
    scanf("%i", &sp -> age);

【讨论】:

以上是关于C中的结构和指针(将字符串分配给结构)的主要内容,如果未能解决你的问题,请参考以下文章

C中结构中的指针-如何将给定的void指针的值分配给结构中的指针[关闭]

将一个int(例如10)分配给c ++中结构中的字符串成员,为啥它编译成功?

c语言如何给结构体指针赋值?

如何将结构中的 void 指针分配给另一个结构?

将指向结构的指针分配给变量

在C中为结构中的单个字符分配内存[重复]