用户在 for 循环期间输入的名称会在 C 中覆盖自身

问题描述 投票:0回答:1

我正在尝试用 C 语言编写一个程序,允许用户输入名称,直到输入“完成”一词。然后它将列出他们输入的所有名称。我知道我应该使用一个指针数组来完成此操作,然后使用 while 循环来继续输入名称,然后在输入名称后将指针放入数组中。问题是,一旦我打印出名字,所有的名字都等于我最后输入的名字。

我编写了一个更简单的程序,它执行与我正在执行的操作类似的操作,并遇到了相同的问题。这是代码。

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

int main(void)
{
    char* first;
    char* second;

    for (int i = 0; i < 2; i++)
    {
        char enteredName[20];
        printf("%s", "Please enter a name: ");
        scanf("%s", enteredName);

        if (i == 0)
        {
            first = enteredName;
        }
        else
        {
            second = enteredName;
        }
    }
    printf("First: %s\n", first);
    printf("Second: %s\n", second);
}

该程序的输出是:

Please enter a name: john
Please enter a name: carl
First: carl
Second: carl

我认为正在发生的事情是,第一个和第二个变量都指向内存中的同一位置,因此它们只是说同样的事情。我该如何解决这个问题,同时仍然使用循环输入任意数量的名称?

c string pointers
1个回答
0
投票

我相信正在发生的是第一个和第二个 变量指向内存中的同一位置,因此它们只是说 同样的事情。

是的,这是正确的。指针只保存对象的引用(地址)。您的指针指向(引用)同一个数组。

如何在仍然使用循环输入的情况下解决这个问题 任意数量的名字?

您需要将字符串复制到已分配并分配给指针的内存中

        if (i == 0)
        {
            first = malloc(strlen(enteredName) + 1);
            if(first) strcpy(first, enteredName);
        }
        else
        {
            second = malloc(strlen(enteredName) + 1);
            if(second) strcpy(second, enteredName);
        }
© www.soinside.com 2019 - 2024. All rights reserved.