在下面的代码中,如何访问第二个参数?

时间:2013-04-02 05:51:29

标签: c

char argvv[8][32];

int func(int n, ...)
{
    va_list vl;

    va_start(vl, 8);
    if (i = 1; i <= n; i++)
    {
        strcpy(argvv[i], va_arg(vl, char *));
    }
    va_end(vl);
    parseArgs(n, argvv);
    ...
}

在另一个文件中,我定义:

void parseArgs(int argc, char **argv)
{
    printf("arg1:%s\n", argv[1]);  
        /* ????? I know this is not right; how to access the second argument */
}

3 个答案:

答案 0 :(得分:3)

va_start()的调用是错误的;它应该是:

va_start(vl, n);

此后,您可以像使用va_arg()一样使用。{/ p>

您的parseArgs()函数应声明为:

void parseArgs(int argc, char argv[][32]);

并适当定义。你没有传递指针指针;你正在传递一个2D字符数组,这是完全不同的。如果您在parseArgs()中调用范围func(),则会从编译器中获得转换错误。

SSCCE

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

void parseArgs(int argc, char argv[][32]);

char argvv[8][32];

static int func(int n, ...)
{
    va_list vl;

    va_start(vl, n);
    for (int i = 0; i < n; i++)
        strcpy(argvv[i], va_arg(vl, char *));
    va_end(vl);
    parseArgs(n, argvv);
    return n;
}

void parseArgs(int argc, char argv[][32])
{
    for (int i = 0; i < argc; i++)
        printf("arg%d:%s\n", i, argv[i]);  
}

int main(void)
{
    func(3, "abc", "def", "ghi");
    return 0;
}

答案 1 :(得分:2)

我已在代码中用注释标记了我所更改的内容。

char argvv[8][32];

int func(int n, ...)
{
    va_list vl;
    int i;

    va_start(vl, n); // Changed this line
    if (i = 0; i < n; i++) // Changed this line
    {
        strcpy(argvv[i], va_arg(vl, char *));
    }
    va_end(vl);
    parseArgs(n, argvv);
    ...
}


void parseArgs(int argc, char argv[][32]) // Changed this.
{
    //argv[1] is the 2nd argument - argv[0] is the first
    printf("arg1:%s\n", argv[1]);   
}

C数组以0索引开头。

答案 2 :(得分:1)

void parseArgs(int argc, char **argv)
{    for (int i = 0; i < argc; i++)
        printf("argv[%d] = %s\n", i, argv[i]);
}