c - 如何将调用函数作为 strcpy 中的第二个字符串?
问题描述
我需要从 main 调用一个函数来确定一个字符串值。但是,据我所知,字符串不能采用string_name = call_function()
. 字符串的赋值必须是strcpy(str1, str2)
正确的形式?所以我想知道作为变量名我做错了什么,并且strcpy
是另一个函数的返回字符串值。str1
str2
到目前为止,这就是我所拥有的。
#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);
}
它没有在我的输出屏幕上打印任何内容。
我尝试过的:
get_name(num)
不使用指针(仍然不起作用)
p/s:这不是实际的代码。这只是我正在尝试做的一个例子,实际代码更长,我已经确定这部分是错误的来源。
解决方案
您是对的,不能通过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; }
推荐阅读
- android-studio - Android Studio:Gradle 的依赖缓存可能已损坏
- date - 如何将 CSV 中的变量从文本格式更改为 SAS 中的日期格式?
- javascript - 从两个数组中获取所有可能的组合
- virtual-machine - 通过互联网实现多个远程会话的方法?
- php - 检查 Csv 文件是否包含 Laravel 中的列?
- python - 如何更改 XArray DataArray 的坐标系
- selenium-chromedriver - 执行 Selenium 脚本被阻止
- python - 用于在 JSON 列表中搜索值,然后打印相关键值的 Python 脚本
- css - 如何将滑块放在 WordPress 的排序块中?
- spring-boot - joda-time、jadira 和休眠