0

我有以下代码因 EXC_BAD_ACCESS (code=1) 而失败,并有以下警告:

不兼容的整数到指针转换将“int”传递给“const char *”类型的参数

char *printb(fmt,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)
{
    static char string[256];
    sprintf(string,fmt,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10);
    return(string);
}

此代码正在调用 printb:

    if (gotargs) fname = *(argv++);
    else do {
        printf("file name #%d: ", i+1);
        fname = gets(inbuf);
    } while (*fname == 0);
    if ((gbuf=fopen(fname, "r")) == NULL)
        error(printb("I can't find '%s'", fname));
    printf("reading '%s'...\n", fname);
    if (fgets((lp = inbuf), 512, gbuf) == NULL)
        error("file is empty");

另外,我怎样才能正确地将 gets() 转换为 fgets() ?

谢谢

4

1 回答 1

3

嗯,为什么要用古式的函数声明

char *printb(fmt,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)
{

?

此声明将所有参数声明为ints。您尝试将char *指针传递给此函数只会导致灾难。此外,您没有在printb调用中提供所有参数,这是另一场灾难。

看起来您正在尝试实现一个具有可变数量参数的函数。特别是该语言支持...参数声明。阅读有关可变参数函数和va_list.

您的功能将按照以下方式实现

char *printb(const char *fmt, ...)
{
   static char string[256];
   va_list va;

   va_start(va, fmt);
   vsprintf(string, fmt, va);
   va_end(va);

   return string;
}

或更好

   ...
   vsnprintf(string, sizeof string, fmt, va);
   ...

尽管返回指向内部静态缓冲区的指针的想法也存在缺陷。

同时,试图用你的方法“模仿”可变参数是没有希望的。它行不通。

于 2012-12-08T01:12:51.190 回答