arrays - 使用指针更改 C 函数中的 argv 字符串
问题描述
是否可以在函数中更改您在启动时为程序提供的 argv 字符串?不使用退货?我设法用整数来做到这一点(在传递指针时更改它的值),但我正在努力处理字符串。语法会是什么样子?我真的对整个指针的事情感到困惑:D。
void changestrings(char*strings[]){
char*newstrings[5] = {"a","b","c","d","e"};
*strings = newstrings;
}
int main(int argc, char *argv[])
{
changestrings(&argv);
(void)argc;
return 0;
}
解决方案
C 中的字符串用 表示char *
。这意味着字符串本身是连续存储的,但变量的实际值是内存中的地址,而不是字符串。该地址指向字符串中的第一个字符。
char *argv[]
表示这些指针的数组。该数组的存储方式相同;argv
的“值”只是指向数组中第一个元素的内存地址。
当您获取该数组的地址时,您获取的是变量本身的内存地址,而不是其内容。然后,您可以将此地址传递给函数以修改该变量,这就是您在这里所做的。
这是固定代码:
#include <stdio.h>
void changestrings(char **strings[]) { // 1
char *newstrings[5] = { "a", "b", "c", "d", "e" };
*strings = newstrings;
}
int main(int argc, char *argv[]) {
changestrings(&argv);
// (void)argc // 2
printf("%s\n", argv[0]);
return 0;
}
(我包含了一个printf
以帮助证明更改有效。)
在// 1
,您的原始函数有一个类型为 的参数char *[]
。这是不正确的,因为您在使用on时将地址传递给 a 。因此,这应该是(或)。char *[]
&
argv
char **[]
char ***
在// 2
,我不确定您在尝试什么,但是如果您想更改 的值argc
,您可以简单地分配给它main
或获取它的地址并在另一个函数中修改它。
请注意,argv
如果您定义一个新char *[]
的 in ,您也可以简单地分配给main
。如果您想更改单个字符串,这会变得有点棘手,因为您需要跟踪数组中有多少个,但该代码看起来像这样:
#include <stdio.h>
void change_first_string(char *strings[], int strings_length) {
if (strings_length < 2) return;
strings[0] = "foo";
}
int main(int argc, char *argv[]) {
change_first_string(argv, argc);
printf("%s\n", argv[0]);
return 0;
}
推荐阅读
- python - 如何加载用于 CPU 推理的火炬模型
- google-app-engine - gcloud app deploy 在 Windows 上静默失败
- android - 如何在导航组件中为多个片段提供相同的参数?
- reactjs - 如何使用 Expo React Native 创建白标项目
- git - 使用 .git 创建 git 存储库的存档
- apache-plc4x - 基于 TCP 的 Modbus RTU
- optaplanner - Optaplanner 检查求解器管理器状态
- google-cloud-platform - Google Cloud Platform 中 STOP 实例和 SUSPEND 实例的区别
- python - 如何将 Yen 算法从 Pyretic 代码转换为 RYU 控制器中的 Python 代码?
- javascript - 离开/返回浏览器窗口时选择器打开