C 如何将字符串作为函数参数传递
我正在尝试创建一个函数,该函数获取类似于命令行参数的参数。为此,我想向我的函数传递一个字符串,但我得到了一个分段错误(内核转储) 下面是我在如下所示的函数hello中的尝试C 如何将字符串作为函数参数传递,c,C,我正在尝试创建一个函数,该函数获取类似于命令行参数的参数。为此,我想向我的函数传递一个字符串,但我得到了一个分段错误(内核转储) 下面是我在如下所示的函数hello中的尝试 int hello(int argc, char **argv) {
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;
}
我想去
i
am
fine
但是得到的是分段错误。与你好(5,“我很好”)代码>在main.c中,有三件事应该是正确的:
- 编译时未启用(许多)警告消息。如果是这样,请在编译器中打开警告消息
- 编译器警告您,
hello
未声明(并且可能假定声明/类型)。如果是这样,请在main.c中插入hello
声明(或将其放在名为hello.h的标题中,并在main.c中插入#include
)
- main.c包含您在问题中没有向我们展示的代码,要么是
hello
的声明,要么是头文件的包含,main.c或头文件中hello
的声明与其在hello.c中的定义不同。如果是,请在问题中显示完整代码
解决上述问题后,main.c(显式地或包含在头文件中)中应该有一个与其在hello.c中的定义相匹配的hello
声明:
int hello(int argc, char *argv[]);
一旦该声明在main.c中,编译器应该警告您调用hello(5,“我很好”)代码>与声明不匹配。这是因为“我很好”
是一个字符数组,以这种方式使用时,会自动转换为指向其第一个元素的指针。因此,传递的参数是指向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 });
在代码中,使用字符串而不是字符串数组调用函数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;
}
#包括
#定义LEN(arr)(sizeof(arr)/sizeof(arr)[0])
void hello(int argc,const char**argv)
{
int i=0;
printf(“%d\n”,argc);
对于(i=0;i
我还添加了一个const
限定符,以指示字符串不会被修改。您好,欢迎光临。你到底想干什么?你为什么期望这样的结果?为什么是5?请再解释一下。您正在传递char*
而不是char**
并传递一个无意义的argc
值。您正在将char*
传递给hello
,但它需要一个char**
。这并不奇怪,它不起作用。@Sheik在任何情况下,字符串文字“我很好”是一个对象“我很好”
是一个字符串文字,即char*
,一个指向字符序列中第一个字符的指针,以值0
的字符终止char**argv
是一系列这样的东西。非常感谢Eric..我从你的回答中得到了我想要的..很抱歉问题不清楚。。。
#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;
}