我正在尝试创建一个函数,该函数获取类似于命令行参数的参数。为此,我想将一个字符串传递给我的函数,但是我遇到了一个分段错误(核心已转储)。
这是我在下面显示的功能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
但出现细分错误。
答案 0 :(得分:3)
在main.c中使用hello(5,"i am fine");
时,应满足以下三个条件之一:
hello
(并且可能假定了它的声明/类型)。如果是这样,请在main.c中插入一个hello
声明(或将其放在名为hello.h的标头中,然后在main.c中插入#include <hello.h>
)。hello
的声明或包含头文件,以及在main.c或标题中的hello
声明文件与hello.c中的定义不同。如果是这样,请显示问题中的完整代码。一旦解决了上述问题,main.c中的声明hello
(明确或包含在头文件中)应与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 });
答案 1 :(得分:0)
在代码中,您使用字符串而不是字符串数组调用函数 hello 。这是更正的版本:
#include <stdio.h>
#define LEN(arr) (sizeof (arr) / sizeof (arr)[0])
void hello(int argc, const char **argv)
{
int i = 0;
printf("%d\n", argc);
for (i = 0; i < argc; i++) {
printf("%s\n", argv[i]);
}
}
int main(void)
{
const char *args[] = {"i", "am", "fine"};
hello(LEN(args), args);
return 0;
}
我还添加了一个const
限定符,以指示不会修改字符串。