【问题标题】:Incompatible integer to pointer conversion passing 'int' to parameter of type 'const char *'不兼容的整数到指针转换将“int”传递给“const char *”类型的参数
【发布时间】:2012-12-08 01:09:56
【问题描述】:

我的以下代码因 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()?

谢谢

【问题讨论】:

  • 您尚未声明printb() 函数参数的类型。这是故意的,还是你对 C 很陌生?
  • 很久没写C了,这段代码本身就很古老。

标签: c


【解决方案1】:

那你为什么要用古式的函数声明

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

虽然返回一个指向内部静态缓冲区的指针的想法也是有缺陷的。

同时,试图通过您的方法“模拟”可变参数是没有希望的。它不会起作用。

【讨论】:

  • 所以 char *printb(char *fmt,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) 是我想要的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 2015-03-08
  • 2019-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多