-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]);

適切に定義されています。ポインターにポインターを渡していません。文字の 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;
}
于 2013-04-02T05:58:12.100 に答える
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 に答える