自己实现一个sprintf,结果win得不到正确结果,linux上倒可以
代码如下:
#include <stdio.h>
#include <stdarg.h>
int mysprintf(char *szBuff, char *fmt, ...);
int main(int argc, char *argv[])
{
char buffer[64] = {0};
int num = 10;
mysprintf(buffer, "%d, %s\n", num, "hello world");
printf(buffer);
return 0;
}
int mysprintf(char *szBuff, char *fmt, ...)
{
va_list ap = NULL;
char *pFmt = fmt;
char *pBuff = szBuff;
va_start(ap, pFmt);
while (*pFmt != NULL)
{
if (*pFmt != '%')
{
*pBuff++ = *pFmt++;
}
else
{
int swNum = 0;
char numBuff[64] = {0};
char *szStr = NULL;
pFmt++;
switch(*pFmt++)
{
case 'd':
swNum = va_arg(ap, int);
itoa(swNum, numBuff, 10);
strcpy(pBuff, numBuff);
pBuff += strlen(numBuff);
break;
case 's':
szStr = va_arg(ap, char *);
strcpy(pBuff, szStr);
pBuff += strlen(szStr);
break;
default:
printf("invalid format\n");
break;
}
}
}
va_end(ap);
return 0;
}
请各位大侠分析下原因 c
[解决办法]
具体为什么我还没不知道!
不过
va_start(ap, pFmt);
改为
va_start(ap, fmt);
就可以了
我觉可以是宏的问题!
va_start是一个宏不是函数,所以看的不是地址!
va_start是说ap从fmt这个参数后开始算不定参!
pFmt它就看不懂了!Linux为什么可以我就不知道了!我只用Windows!
希望对你有用!!!!!