C 如何将字符串作为函数参数传递

C 如何将字符串作为函数参数传递,c,C,我正在尝试创建一个函数,该函数获取类似于命令行参数的参数。为此,我想向我的函数传递一个字符串,但我得到了一个分段错误(内核转储) 下面是我在如下所示的函数hello中的尝试 int hello(int argc, char **argv) {

我正在尝试创建一个函数,该函数获取类似于命令行参数的参数。为此,我想向我的函数传递一个字符串,但我得到了一个分段错误(内核转储)

下面是我在如下所示的函数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;                                                                   
}  
我想去

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;
}