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

时间:2019-07-30 12:50:22

标签: c

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

这是我在下面显示的功能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

但出现细分错误。

2 个答案:

答案 0 :(得分:3)

在main.c中使用hello(5,"i am fine");时,应满足以下三个条件之一:

  • 您编译时未在编译器中启用(许多)警告消息。如果是这样,请在编译器中打开警告消息。
  • 编译器会警告您未声明hello(并且可能假定了它的声明/类型)。如果是这样,请在main.c中插入一个hello声明(或将其放在名为hello.h的标头中,然后在main.c中插入#include <hello.h>)。
  • main.c包含您未在问题中向我们显示的代码,或者为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限定符,以指示不会修改字符串。