【问题标题】:Ask data from user and store them inside a struct in C向用户询问数据并将它们存储在 C 中的结构中
【发布时间】:2020-12-09 14:25:45
【问题描述】:

在下面的代码中,我尝试使用 printf 和 scanf 从用户获取数据并将它们存储在我定义的名为 node 的结构中。

程序在第一个提示下运行良好,但是一旦用户输入姓名,程序就会以打印 Age:salary: 结束

谁能帮我解决这个问题?

顺便说一句,任何人都可以帮助我了解如何创建一个循环来将数据存储在各个节点中并将它们存储在一起吗? (不是一一硬编码)

非常感谢!!

typedef struct node
{
    char *name;
    int age;
    int salary;
    struct node * next;
}node;

int main(void)
{
        node *tmp = malloc(sizeof(node));
        
        printf("Name:");
        scanf("%s", tmp->name);
        
        printf("Age:");
        scanf("%i", &(tmp->age));
        
        printf("salary:");
        scanf("%i", &(tmp->salary));
        
        tmp->next = NULL;
        
        free(tmp);
}

【问题讨论】:

  • char *name; 你需要分配内存来写入
  • 我努力回答了您的另一个问题。然后你删除了它而没有提供反馈。如果你经常这样做,人们可能会停止回答你的问题。所以我希望删除只是暂时的,直到你改进了问题。
  • 你完全误解了,我删除我的问题是因为我看到你的评论,我意识到我在这个问题上搞砸了,所以我把它删除了。我为此道歉,我不打算这样做。真的很感谢你在这个问题上的回答,但我仍然需要做一些事情来消化答案

标签: c pointers struct scanf nodes


【解决方案1】:

使用 char[] 作为名称, 例如:

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

typedef struct node
{
    char          name[128];
    int           age;
    int           salary;
    struct node * next;
}node;

int main(void)
{
    node *tmp = malloc(sizeof(node));

    printf("Name:");
    scanf("%s", tmp->name);

    printf("Age:");
    scanf("%i", &(tmp->age));

    printf("salary:");
    scanf("%i", &(tmp->salary));

    tmp->next = NULL;

    free(tmp);
}

如果您想获得多个用户,请永远循环并询问用户是否要添加更多数据。 我已经创建了一个函数来打印列表

控制台:

Name:Foo
Age:12
salary:12
Continue Y/N
Y
Name:Bar
Age:14
salary:14
Continue Y/N
Y
Name:John 
Age:30
salary:45
Continue Y/N
N
John, 30, 45
Bar, 14, 14
Foo, 12, 12
#include <stdlib.h>
#include <stdio.h>

typedef struct node
{
    char          name[128];
    int           age;
    int           salary;
    struct node * next;
}node;

static void printList(node *n)
{
    while (n) {
        printf("%s, %d, %d\n", n->name, n->age, n->salary);
        n = n->next;
    }
}

static node *get_nodes(void) {
    node *list = NULL;
    while (42) {
        char c;
        node *tmp = malloc(sizeof(node));

        printf("Name:");
        scanf("%s", tmp->name);

        printf("Age:");
        scanf("%i", &(tmp->age));

        printf("salary:");
        scanf("%i", &(tmp->salary));

        tmp->next = list;
        list = tmp;
        printf("Continue Y/N\n");
        scanf(" %c", &c);
        if (c == 'N')
            break;
    }
    return list;
}

static void clearList(node *node) {
    if (node->next) {
        clearList(node->next);
    }
    free(node);
}

int main(void)
{
    node *list = get_nodes();
    printList(list);
    clearList(list);
    return 0;
}

【讨论】:

  • 谢谢!!现在解决了,但是你能教我如何编写一些循环来从用户那里获取数据并将它们存储在链表中,从而帮助我更多吗?无论如何,非常感谢。
  • 对不起,我差点错过你的回答,非常感谢,先生!
【解决方案2】:

您正在尝试写入未初始化的内存

这是初学者很常见的问题。

您正在尝试使用 char *name 声明来存储名称。 这里的 name 没有指向一个有效的内存位置,这就是你的程序没有按预期运行的原因。

即使name 指向一个有效的内存地址,您也必须分配足够的内存来存储数据。

你可以使用

#define BUFFER_SIZE 50
char name[BUFFER_SIZE];

您可以根据需要使用任何缓冲区大小,然后将长度为 1 的字符串存储在 name 数组中。 -1 代表null termination character \0

使用此声明,您将分配 BUFFER_SIZE 字节的内存,而 name 指向该数组中的第一个字节。

此分配发生在堆栈上,而不是在 HEAP 中

【讨论】:

  • 谢谢!!现在解决了,但是你能教我如何编写一些循环来从用户那里获取数据并将它们存储在链表中,从而帮助我更多吗?无论如何,非常感谢。
  • 很高兴为您提供帮助,并为您提出问题:在收集数据结束时您可以询问用户是否要输入更多数据,然后使用scanf收听,如果答案是@ 987654331@你回来。如果是y,则使用tmp.next = malloc(sizeof(node)) 然后tmp = tmp.next 分配一个新节点,并将此代码放入while 循环中。您还可以创建一个node.previous 成员并将其指向上一个节点。我相信网上有很多文章和教程,你也可以用它来了解更多。
  • 需要一些时间来消化并尝试用代码编写它,但无论如何,非常感谢您的帮助!!:)
【解决方案3】:

为了修复你的错误,你应该分配你的 char * 的内存。

第一种方式,当你创建你的结构时。

typedef struct node
{
    char name[200]; // You specify that your char * can save 200 char
    int age;
    int salary;
    struct node * next;
}node;

或者你可以创建初始化结构函数

node *init_node()
{
   node *test = null;
   test->name = malloc(sizeof(char) * 200);
   test->age = 0;
   test->salary = 0;
   test->node = null;
   return test
}

【讨论】:

  • 前半部分我明白你在说什么,但后半部分的语法对我来说似乎很新,有什么我应该学习的主题吗?
  • 第二部分只是一个函数,你调用它并返回一个node * ,默认值(int变量为0,char * malloc,...)
猜你喜欢
  • 1970-01-01
  • 2017-09-15
  • 1970-01-01
  • 1970-01-01
  • 2019-09-05
  • 1970-01-01
  • 2015-08-31
  • 2019-01-29
  • 1970-01-01
相关资源
最近更新 更多