【问题标题】:Having trouble inputting a single node into my singly linked list无法将单个节点输入到我的单链表中
【发布时间】:2020-04-06 19:21:38
【问题描述】:

我正在创建一个只有一个节点的单链表,但在让它按我想要的方式工作时遇到了一些麻烦。当我输入我想放在列表中的信息时,我会在不做任何事情的情况下将我的最后一条数据附加到前一个数据中。这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#define maxName 30
#define maxID 10
#define maxAge 3

typedef struct node
{
    char fName[maxName];
    char lname[maxName];
    char PUID[maxID];
    char age[maxAge];
    struct node *next;
}node;

node *head = NULL;

//This function will create a list with just a single node and the data to the list must be passed by paramter
node * createnode(char firstName[], char lastName[], char puid[], char age[])
{
    head = (node*)malloc(sizeof(node));

    printf("Enter the first name: ");
    scanf("%s", &(head -> fName));

    printf("Enter the last name: ");
    scanf("%s", &(head -> lname));

    printf("Enter the PUID: ");
    scanf("%s", &(head -> PUID));

    printf("Enter the Age: ");
    scanf("%s", &(head -> age));

    return head;
}

这是我输入信息时得到的输出: 杰克,托马斯,789456987525,25->

25 附加到我输入的 PUID 的末尾。任何帮助你都很棒!谢谢!

【问题讨论】:

  • 如果你想在一个 char 缓冲区中存储一个 10 位的 id,该缓冲区应该是一个至少包含 11 个字符的数组,因为它需要一个作为空终止符。并且您应该强制用户输入的数字不能超过 10 位,否则缓冲区会溢出。这就是你的情况。
  • 如果一个答案对你有帮助,你应该点击投票号下的勾号按钮。

标签: c linked-list scanf singly-linked-list c-strings


【解决方案1】:

您应该删除地址运算符。

printf("Enter the first name: ");
scanf("%s", (head -> fName));

printf("Enter the last name: ");
scanf("%s", (head -> lname));

printf("Enter the PUID: ");
scanf("%s", (head -> PUID));

printf("Enter the Age: ");
scanf("%s", (head -> age));

【讨论】:

    【解决方案2】:

    这个函数声明

    node * createnode(char firstName[], char lastName[], char puid[], char age[]);
    

    没有意义,因为函数中没有使用参数。

    所以函数应该这样声明

    node * createnode( void );
    

    在这样的函数语句中

    scanf("%s", &(head -> fName));
               ^^^
    

    不正确。他们必须看起来像

    scanf("%s", head -> fName);
    

    至于错误的输出,似乎您在字符数组中输入的字符数超过了它可以容纳的字符数,包括字符串的终止零。

    例如,输入的符号7894569875 将存储在数据成员PUID 中,例如字符串"7894569875",其中包含11 个字符(包括终止零字符)而不是10 个。

    使用函数 fgets 代替带有格式说明符 %s 的 scanf 更安全。

    例如

    #include <string.h>
    
    //...
    
    
    fgets( head->fName, maxName, stdin );
    head->fName[ strcspn( head->fName, "\n" ) ] = '\0';
    

    请注意,当函数依赖于全局变量时,这是一个坏主意。在这种情况下,您将无法例如必须在程序中列出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多