在 C 中将 char 数组从函数返回给变量

returning an array of char from a function to a variable in C

提问人:Noori Muhammed 提问时间:10/26/2023 更新时间:10/26/2023 访问量:93

问:

我正在学习 C,但是当我想将字符串从函数返回到 main 时遇到了一些问题。这是代码的一部分(我知道这是完全错误的,但我不知道如何让它做我想做的事)

我知道返回值(*name)只返回字符串的第一个字符的位置并将其传递给main。

int main(void)
{
    char name[100] = {get_name("Name: ")};
    printf("%s\n", name);
}

char get_name(char prompt[])
{
    printf("%s", prompt);
    char name[100];
    scanf("%s", name);
    return *name;
}

我认为不可能将整个字符串返回到 main 函数,这就是我使用指针的原因;但是我再也无法获得整个字符串了。我什至检查了 main 中数组的长度,它显示 100,但其中只有一个字符并且 name[1] 为空。

有人可以向我解释为什么它会这样以及如何修复它吗?我到处寻找,但找不到线索。

C 函数 指针

评论

4赞 Support Ukraine 10/26/2023
在 C 中,不能按值返回数组。
2赞 steven7mwesigwa 10/26/2023
这回答了你的问题吗?从函数返回 C 字符串
0赞 steven7mwesigwa 10/26/2023
另一个可能的重复项:从 C 函数返回字符串
0赞 Mike Nakis 10/26/2023
那么,你认为有什么作用呢?char name[100] = {some-char};

答:

1赞 chux - Reinstate Monica #1

当我想从函数返回字符串时,将 char 数组从函数返回到 C
中的变量

在 C 中,不能返回数组。可以返回指向数组的指针。

在 C 中,不能返回字符串。可以返回指向字符串的指针。

评论

0赞 steven7mwesigwa 10/26/2023
这个问题已经有多个重复项。您可能需要投票来关闭它。
0赞 greg spears 10/26/2023 #2

以下是完成您想要的操作的方法 -- 代码按以下内容更新:

1.) name 数组在 get_name() 中声明为 static。

“当一个变量被声明为静态时,内存会分配给 程序的生存期。即使多次调用函数, 静态变量的空间只分配一次,值 上一个调用中的变量将传递到下一个调用中 函数调用。 信用:www.geeksforgeeks.org

...因此,“static”关键字允许我们将名称字符串返回给 main()

2.) get_name() 更新以返回 char 指针。现在它可以返回指向名称数组的指针。

请参阅我为每次更改添加到代码中的“更新”注释。

这是可运行的代码。

#include <stdio.h>

char *get_name(char prompt[])  /* Updated:  returns char pointer */
{
    static char name[100]="Billy";  /* Updated:  static key word */
    printf("%s", prompt);
    scanf("%s", name);
    return name;
}

int main(void)
{
    char *name = get_name("Name: ");  /* Updated: name variable is a pointer now */
    printf("%s\n", name);
    return 0;
}

这是另一个受用户@Gerhardh启发的解决方案。它使用动态分配的内存。当您准备好将您的技能提升到一个新的水平时,请检查它。动态内存分配对于任何编码人员来说都是一项关键技能。此处的可运行代码:

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

char *get_name(char prompt[])  /* Updated:  returns char pointer */
{
    char *name= malloc(100);  /* Updated: uses memory allocation. */
    if(name)  /* Was memory allocation a success? */
    {
        /* Answer: yes... we can proceed to use that memory: */
        printf("%s", prompt);
        scanf("%s", name);
    }
    return name;
}

int main(void)
{
    char *name = get_name("Name: ");  /* Updated: name variable is a pointer now */
    if(name)  /* Was memory allocation a success? */
    {
        printf("%s\n", name);
        free(name); /* Free the allocated memory when you are done with it */
    }
    else
        printf("Memory allocation failed!\n");
    return 0;
}

评论

1赞 Noori Muhammed 10/26/2023
谢谢,它有效,我想我知道如何去做。得多玩一会儿。
0赞 greg spears 10/26/2023
@Noori 穆罕默德 -- 非常欢迎和最良好的祝愿。感谢您的反馈;知道我帮了我一点忙,对我来说总是意义重大。
1赞 Gerhardh 10/26/2023
您可以补充一点,您不能使用该函数读取 2 个不同的字符串。由于在每次函数调用中使用相同的缓冲区,因此保存从该函数返回的指针的所有变量都将指向同一字符串。
2赞 Gerhardh 10/26/2023
“但我感觉到我们的来电者是新来的,”这也是我的观点。另一个理由不是把他们送到下一个陷阱正等着他们掉进去的方向。
1赞 steven7mwesigwa 10/26/2023
这个问题已经有多个重复项。您可能需要投票来关闭它。使用关键字、using 和其他方法已经在其他问题中详细解释过。如果有什么独特的,您可以考虑将其添加到前面的问题中。否则,你只会让网站维护者更难关闭重复的问题。staticmalloc()