首页 > 解决方案 > 如何将调用函数作为 strcpy 中的第二个字符串?

问题描述

我需要从 main 调用一个函数来确定一个字符串值。但是,据我所知,字符串不能采用string_name = call_function(). 字符串的赋值必须是strcpy(str1, str2)正确的形式?所以我想知道作为变量名我做错了什么,并且strcpy是另一个函数的返回字符串值。str1str2

到目前为止,这就是我所拥有的。

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

char *get_name(int num);

char *get_name(int num) {
    char real_name[30];
    
    if (num == 1)
        strcpy(real_name, "Jake Peralta");
    
    return real_name;
}

void main() {
    char name[30];
    int num;
    
    num = 1;
    
    strcpy(name, *get_name(num));
    printf("%s", name);
}

它没有在我的输出屏幕上打印任何内容。

我尝试过的:

p/s:这不是实际的代码。这只是我正在尝试做的一个例子,实际代码更长,我已经确定这部分是错误的来源。

标签: cfunctionstrcpy

解决方案


您是对的,不能通过return语句将字符串作为数组返回。当您传递或返回一个数组时,只使用指向其第一个元素的指针。因此,该函数get_name()返回一个指向使用自动存储在本地定义的数组的指针(也就是在堆栈上)。这是不正确的,因为这个数组一旦超出范围就会被丢弃,即:当函数返回时。

有几种方法可以get_name()向调用者提供名称:

  • 您可以传递目标数组及其长度:并让函数在数组中填充名称,小心避免超出数组末尾但确保它有一个空终止符:

     char *get_name(char *dest, size_t size, int num) {
         if (num == 1) {
             snprintf(dest, size, "Jake Peralta");
         } else {
             snprintf(dest, size, "John Doe");
         }
         // return the destination pointer for convenience.
         return dest;
     }
    
     int main() {
         char name[30];
         int num = 1;
         get_name(name, sizeof name, num);
         printf("%s\n", name);
         return 0;
     }
    
  • 您可以在其中分配内存get_name()并返回指向复制字符串的已分配数组的指针。free()当不再使用该对象时,调用者将负责释放该对象。

     char *get_name(int num) {
         if (num == 1) {
             return strdup("Jake Peralta");
         } else {
             return strdup("John Doe");
         }
     }
    
     int main() {
         int num = 1;
         char *name = get_name(num);
         printf("%s\n", name);
         free(name);
         return 0;
     }
    
  • 您可以返回一个常量字符串,但只有在编译时知道所有名称时才能这样做。

     const char *get_name(int num) {
         if (num == 1) {
             "Jake Peralta";
         } else {
             "John Doe";
         }
     }
    
     int main() {
         int num = 1;
         const char *name = get_name(num);
         printf("%s\n", name);
         return 0;
     }
    

推荐阅读