如何正确传递这个c字符串数组?

时间:2014-02-09 04:31:26

标签: c arrays char parameter-passing cstring

我的C-Strings数组声明为:

char *argv[MAXARGS];

MAXARGS基本上只是告诉我们有多少c字符串在数组中用于索引目的。 我想将它传递给下面的函数...

int builtin_cmd(char **argv)

但似乎没有任何事情可以通过,我这样调用了这个函数。

    char *argv[MAXARGS];

    builtin_cmd(argv);

但是一旦我进入函数builtin_cmd并尝试使用

进行打印
printf("%s\n", argv[0]);

它什么都没打印....但是当我在调用函数之前这样做...

char *argv[MAXARGS];
printf("%s\n", argv[0]);
//builtin_cmd(argv);

它将打印c字符串数组中的第一个C字符串就好了。 我的想法是,我正在顺利通过这个结构,我想知道将它传递给函数的正确方法。

编辑:

int builtin_cmd(char **argv);
int main()
{
    char *argv[128];
    //put 'quit' into argv[0]..
    printf("%s\n", argv[0]); //prints 'quit'
    builtin_cmd(argv);
}
int builtin_cmd(char **argv)
{
    printf("%s\n", argv[0]); //prints nothing
}

问题是,我似乎无法将argv引入该函数。它也可以编译,没有任何错误或警告。

3 个答案:

答案 0 :(得分:1)

您尚未展示如何初始化阵列,这是至关重要的部分。

#include <stdio.h>

static void builtin_cmd(char **argv)
{
     while (*argv != NULL)
         printf("%s\n", *argv++);
}

int main(void)
{
    char *argv[] = { "abc", "def", "ghi", NULL };
    builtin_cmd(argv);
    return 0;
}

此代码使用sentinel值(空指针)来标记数据的结尾。另一种方法是将数组中的字符串数作为单独的参数传递。当您使用int main(int argc, char **argv)时,实际上您正在使用这两种机制; argv[argc] == NULL所以有计数然后是哨兵价值。

答案 1 :(得分:1)

您正在尝试将一个字符指针数组传递给函数,因此您的函数声明应为builtin_cmd(char* argv[])。这是一个将指针数组传递给函数的示例示例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void fill_strings(char *str[], int nstrings)
{
    int i;
    for ( i=0; i < nstrings; i++)
        strcpy(str[i], "hello world");
}

void print_strings(char *str[], int nstrings)
{
    int i;
    for (i=0; i < nstrings; i++)
        printf("string %d: %s\n", i, str[i]);
}

int main(void)
{
    char *index[10];
    int i;
    for(i=0; i<10; i++)
    {
        index[i] = malloc(20);
    }
    fill_strings(index, 10);
    print_strings(index, 10);

    return 0;
}

答案 2 :(得分:0)

如果您在命令行上传递输入,则需要告诉编译器您正在使用从运行时传递到main的参数。

int main(int argc, char **argv)
{

这应该允许你正确地传递“quit”作为第一个参数。否则,正如其他人所说,你如何填写“C矢量”很重要。