链表 char 指针 scanf 输入
linked list char pointer scanf input
我正在尝试使用 scanf
多次输入链表中的字符指针。但每次我输入新的输入时,所有字段的 name
都会发生变化。
这是我的链表:
struct node {
struct node *next;
int level;
char *name;
};
这是我的主要功能:
struct node *root = NULL;
while (1) {
char arrays[12];
char *n;
n = arrays;
int i = NULL;
printf("Enter level: ");
scanf("%i", &i);
printf("\nEnter name: ");
scanf("%s", arrays);
insert(&root, i, n, compare);
display(root);
}
插入函数:
void insert(struct node **head, const int level, char *name, int(*cmp)(struct node *l, struct node *r))
{
struct node *new;
new = malloc(sizeof *new);
new->level = level;
new->name = name;
/* Find the insertion point */
for (; *head != NULL; head = &(*head)->next)
{
if ((*head)->level > level || (*head)->level == level && cmp(*head, new) > 0) { break; }
}
new->next = *head;
*head = new;
}
基本上如果我输入:
input: | expected output: | actual output:
1 smith | 1 john | 1 alice
1 john | 1 smith | 1 alice
3 malek | 2 alice | 2 alice
2 alice | 3 malek | 3 alice
注意:当我在没有 scanf
的情况下手动输入数据时,功能按预期工作,例如:
insert(&root, 1, "Abbas", compare);
insert(&root, 1, "Calbass", compare);
这一行:
new->name = name;
只是更改指针的值 - 它不会复制字符串。所以链表中的所有元素都会指向arrays
。因此,更改 arrays
的内容会使它看起来好像列表中的所有元素都已更改(但实际上并没有)。
您可能需要:
strcpy(新->名字, 名字);
然后您还需要 malloc
存储字符串。
类似于:
new = malloc(sizeof *new);
new->level = level;
new->name = malloc(12 * sizeof(char)); // Memory for the string
strcpy(new->name, name); // Copy the input string
顺便说一句:
改变
insert(&root, i, n, compare);
到
insert(&root, i, arrays, compare);
并删除 n
变量。功能相同,但编码器更易于阅读和理解。
看起来您正在向列表中插入一个指向 arrays
的指针。当你写:
insert(&root, 1, "Abbas", compare);
它的工作是因为没有修改字符串文字 "Abbas",但是每次执行 scanf("%s", arrays);
时 arrays
的内容都会被覆盖。考虑将 char* 名称更改为 char 名称 [12] 并将输入 直接 读取到节点中。
我正在尝试使用 scanf
多次输入链表中的字符指针。但每次我输入新的输入时,所有字段的 name
都会发生变化。
这是我的链表:
struct node {
struct node *next;
int level;
char *name;
};
这是我的主要功能:
struct node *root = NULL;
while (1) {
char arrays[12];
char *n;
n = arrays;
int i = NULL;
printf("Enter level: ");
scanf("%i", &i);
printf("\nEnter name: ");
scanf("%s", arrays);
insert(&root, i, n, compare);
display(root);
}
插入函数:
void insert(struct node **head, const int level, char *name, int(*cmp)(struct node *l, struct node *r))
{
struct node *new;
new = malloc(sizeof *new);
new->level = level;
new->name = name;
/* Find the insertion point */
for (; *head != NULL; head = &(*head)->next)
{
if ((*head)->level > level || (*head)->level == level && cmp(*head, new) > 0) { break; }
}
new->next = *head;
*head = new;
}
基本上如果我输入:
input: | expected output: | actual output:
1 smith | 1 john | 1 alice
1 john | 1 smith | 1 alice
3 malek | 2 alice | 2 alice
2 alice | 3 malek | 3 alice
注意:当我在没有 scanf
的情况下手动输入数据时,功能按预期工作,例如:
insert(&root, 1, "Abbas", compare);
insert(&root, 1, "Calbass", compare);
这一行:
new->name = name;
只是更改指针的值 - 它不会复制字符串。所以链表中的所有元素都会指向arrays
。因此,更改 arrays
的内容会使它看起来好像列表中的所有元素都已更改(但实际上并没有)。
您可能需要:
strcpy(新->名字, 名字);
然后您还需要 malloc
存储字符串。
类似于:
new = malloc(sizeof *new);
new->level = level;
new->name = malloc(12 * sizeof(char)); // Memory for the string
strcpy(new->name, name); // Copy the input string
顺便说一句:
改变
insert(&root, i, n, compare);
到
insert(&root, i, arrays, compare);
并删除 n
变量。功能相同,但编码器更易于阅读和理解。
看起来您正在向列表中插入一个指向 arrays
的指针。当你写:
insert(&root, 1, "Abbas", compare);
它的工作是因为没有修改字符串文字 "Abbas",但是每次执行 scanf("%s", arrays);
时 arrays
的内容都会被覆盖。考虑将 char* 名称更改为 char 名称 [12] 并将输入 直接 读取到节点中。