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

时间:2012-12-08 01:09:56

标签: c

我有以下代码,但EXC_BAD_ACCESS(代码= 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()?

由于

1 个答案:

答案 0 :(得分:3)

那么,你为什么要使用古代风格的函数声明

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

此声明将所有参数声明为int s。您尝试将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);
   ...

虽然将指针返回到内部静态缓冲区的想法也存在缺陷。

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