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

标签 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

但是却出现段错误。

最佳答案

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 **将会通过。

另请注意,我更改了 51 。第一个参数是第二个参数指向的字符串数,并且您仅传递一个字符串。

要传递五个字符串,数组中应该有五个字符串,并且要匹配 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/

相关文章:

c - 使用 MPI_Irecv 和 MPI_Test 的无限循环

c++ - Intel Core i7-3770 上的 ACML 5.3.1 段错误

c - 右移 float 的二进制表示 -0.0

c - 二维数组列主序

c - 如何正确从 txt 文件中读取位串,以便计算所有字符串组合的汉明距离

c - qsort 不适用于双数组

c++ - 在指针声明中放置星号

c - Microsoft Visual Studio 2017 需要非常基本的帮助 : "The system cannot find the file specified"

有人可以将此程序集转换为 C 语言吗

c++ - 函数包含未命名参数