我正在尝试创建一个函数,该函数获取类似于命令行参数的参数。为此,我想将一个字符串传递给我的函数,但我遇到了段错误(核心转储)。
这是我在 hello 函数中的尝试,如下所示,
int hello(int argc, char **argv)
{
int i=0;
printf("%d\n", argc);
for(i=0; i<argc; i++)
printf("%s\n", argv[i]);
return 0;
}
我从 main 调用,
int main ()
{
hello(3, "i am fine");
return 0;
}
我想要得到
i
am
fine
但是却出现段错误。
最佳答案
与 hello(5,"i am fine");
在 main.c 中,以下三件事之一应该为真:
- 您在编译时没有启用(许多)警告消息。如果是这样,请在编译器中打开警告消息。
- 编译器警告您
hello
没有声明(也许它假设了一个声明/类型)。如果是这样,请插入hello
的声明在 main.c 中(或者将其放入名为 hello.h 的 header 中并在 main.c 中插入#include <hello.h>
)。 - main.c 包含您在问题中未向我们展示的代码,或者
hello
的声明或头文件的包含,以及hello
的声明main.c 或头文件中的定义与 hello.c 中的定义不同。如果是这样,请显示问题中的完整代码。
解决上述问题后,应该有 hello
的声明在 main.c 中(显式或包含在头文件中)与其在 hello.c 中的定义相匹配:
int hello(int argc, char *argv[]);
一旦该声明位于 main.c 中,编译器应警告您调用 hello(5,"i am fine");
与声明不符。这是因为"i am fine"
是一个字符数组,当以这种方式使用时,会自动转换为指向其第一个元素的指针。所以传递的参数是一个指向 char
的指针,也称为char *
。但参数是char **
.
所以你需要传递一个 char **
。一个简单的方法是创建一个 char *
的数组。 :
char *Arguments[] = { "i am fine" };
然后你可以将数组传递给hello
:
hello(1, Arguments);
与 char
数组一样,这个数组 char *
将自动转换为指向其第一个参数的指针,因此 char **
将会通过。
另请注意,我更改了 5
至1
。第一个参数是第二个参数指向的字符串数,并且您仅传递一个字符串。
要传递五个字符串,数组中应该有五个字符串,并且要匹配 main
的参数。指定后,数组中应该有一个附加元素为空指针:
char *Arguments[] = { "i am fine", "two", "three", "four", "five", 0 };
hello(5, Arguments);
完成此操作后,您可以使用复合文字而不是命名数组。复合文字是一种在表达式中创建对象的方法,它使用括号中的类型名称,后跟大括号中的对象值:
hello(5, (char *[]) { "i am fine", "two", "three", "four", "five", 0 });
关于c - 如何将字符串作为函数参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57272143/