系统移植,printf的问题.路过有分

huanyun 2007-03-01 09:26:22
手上有个移植工作

在代中使用例如 printf("%04s", "abc");

在Win AIX ScoUnix下均输出 "0abc"
在红帽Linux下输出 " abc"

请问如何让Linux保持和Win AIX ScoUnix系统一致?

谢谢!
...全文
269 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jason20042008 2007-03-08
  • 打赏
  • 举报
回复
嘿嘿,偷懒的工作,只把s%改了,最好其他格式没有不一致的地方了。
huanyun 2007-03-08
  • 打赏
  • 举报
回复
我的解决方案

int XSprintf(char* szStr, const char* szFormat, ...)
{
int nRet = -1;
char* szFormatNew = NULL;
const char* pSrc;
const char* pStart;
const char* pTmpStart;
char* pDst;
char* pTmpDst;
char* pArg;
int nMode = 0;
int nZero = 0;
va_list args;

if(szStr == NULL || szFormat == NULL) return nRet;

szFormatNew = (char*)malloc(strlen(szFormat) * 2 + 2048);

if(szFormatNew == NULL) return nRet;

pSrc = szFormat;
pDst = szFormatNew;

va_start(args, szFormat);

while(*pSrc != '\0')
{
switch(nMode)
{
case 1:
if(*pSrc == '%')
{
nMode = 0;
*pDst++ = *pSrc++;
}
else
{
pStart = pSrc;
nMode = 2;
++pSrc;
}
break;
case 2:
switch(*pSrc)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '.':
case '-':
case '+':
case '\'':
++pSrc;
break;
case 's':
if(pStart[0] == '0')
{
pTmpStart = pStart;
pTmpDst = pDst;
while(pStart <= pSrc && *pStart == '0') ++pStart;
while(pStart < pSrc) *pDst++ = *pStart++;
*pDst = '\0';
pArg = va_arg(args, char*);
printf("%s\n", pArg);
nZero = atoi(pTmpDst) - strlen(pArg);
if(nZero > 0)
{
--pTmpDst;
memset(pTmpDst, '0', nZero);
pTmpDst += nZero;
*pTmpDst++ = '%';
pDst = pTmpDst;
}
}
else
{
va_arg(args, char);
while(pStart < pSrc) *pDst++ = *pStart++;
}

*pDst++ = *pSrc++;
nMode = 0;
break;
default:
va_arg(args, char);
while(pStart < pSrc) *pDst++ = *pStart++;
*pDst++ = *pSrc++;
nMode = 0;
break;
}
break;
case 0:
default:
if(*pSrc == '%') nMode = 1;
*pDst++ = *pSrc++;
break;
}
}

va_end(args);

*pDst = '\0';

va_start(args, szFormat);

nRet = vsprintf(szStr, szFormatNew, args);

va_end(args);

free( szFormatNew );

return nRet;
}
jason20042008 2007-03-02
  • 打赏
  • 举报
回复
可能是不同版本的libc中printf处理格式化字符串的方式不同吧。找个开源的libc(好像有个伯克利版本的)参考一下自己写个printf,不难,记得最终都是调用putc之类的。
xyxfly 2007-03-02
  • 打赏
  • 举报
回复
:)

不懂
syy64 2007-03-02
  • 打赏
  • 举报
回复
同上
jzx55255 2007-03-02
  • 打赏
  • 举报
回复
关注ing
miaoshengwu 2007-03-02
  • 打赏
  • 举报
回复
学习
ouyh12345 2007-03-02
  • 打赏
  • 举报
回复
up
tracing 2007-03-02
  • 打赏
  • 举报
回复
路过,学习,接分
菜牛 2007-03-02
  • 打赏
  • 举报
回复
记不清楚了,好像gcc有个编译开关的,转到Linux区问问。
做鸡真好吃 2007-03-02
  • 打赏
  • 举报
回复
jf~
mynamelj 2007-03-01
  • 打赏
  • 举报
回复
使用#define宏
ToperRay 2007-03-01
  • 打赏
  • 举报
回复
不懂,学习

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧