我有以下代码,但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()?
由于
答案 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);
...
虽然将指针返回到内部静态缓冲区的想法也存在缺陷。
同时,尝试用你的方法“模仿”可变参数是没有希望的。它不起作用。