-1
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 */
}
4

3 回答 3

3

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

va_start(vl, n);

此后,您可以照常使用va_arg()

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

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

并适当定义。您没有将指针传递给指针;您正在传递一个二维字符数组,这是完全不同的。如果您parseArgs()在调用 in 范围内声明了 in 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;
}
于 2013-04-02T05:58:12.100 回答
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 索引开始。

于 2013-04-02T06:05:31.510 回答
1
void parseArgs(int argc, char **argv)
{    for (int i = 0; i < argc; i++)
        printf("argv[%d] = %s\n", i, argv[i]);
}
于 2013-04-02T06:03:24.507 回答