[quote][code]#include <stdio.h>
int main()
{
printf("%hhh");
return 0;
}[/code]就是上面的代码,在VC++与C-FREE上运行没有结果显示,而在TURBOC上显示的结果则为%hhh
请问下这是为什么?
哪个结果才是正确的呢?[/quote]
这个问题的原因是因为几种编译器对printf函数的实现不同,下面我对这两种情况分别进行了实现
1.DEV_C++,VC++ 6.0,VS200X.....
[code]
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
void Put_Char(int ch)
{
putchar(ch);
}
void Put_Int(int n)
{
char *p,str[20];
itoa(n,str,10);
p=str;
while(*p)
{
Put_Char(*p++);
}
}
int Print(const char *format,...)
{
va_list arg_ptr;
va_start(arg_ptr,format);
while(*format)
{
switch(*format)
{
case('%'):
format++;
switch(*format)
{
case('h'):
RE:
format++;
switch(*format)
{
case('d'):
Put_Int(va_arg(arg_ptr,short));
break;
default:
if(*(format+1))
{
if(*(format+1)=='%')
{
break;
}
else
{
goto RE;
}
}
else
{
break;
}
};
break;
case('d'):
Put_Int(va_arg(arg_ptr,int));
break;
};
break;
default:
Put_Char(*format);
};
format++;
}
va_end(arg_ptr);
return 0;
}
int main()
{
int a=65535;
Print("%hhhh%hhhhd%d%hhhhh",a,a);
return 0;
}
[/code]
2.TC,GCC
[code]
#include<stdio.h>
#include<stdlib.h>
#include<stdarg.h>
#include<string.h>
void Put_Char(int ch)
{
putchar(ch);
}
void Put_Int(int n)
{
char *p,str[20];
itoa(n,str,10);
p=str;
while(*p)
{
Put_Char(*p++);
}
}
void Put_Str(char *str)
{
while(*str)
{
Put_Char(*str++);
}
}
int Print(const char *format,...)
{
va_list arg_ptr;
va_start(arg_ptr,format);
char str[20]={0},flag=0;
while(*format)
{
switch(*format)
{
case('%'):
str[flag++]=*format;
format++;
switch(*format)
{
case('h'):
str[flag++]=*format;
RE:
format++;
switch(*format)
{
case('d'):
Put_Int(va_arg(arg_ptr,int));
memset(str,0,20);
flag=0;
break;
default:
str[flag++]=*format;
if(*(format+1))
{
if(*(format+1)=='%')
{
Put_Str(str);
memset(str,0,20);
flag=0;
}
else
{
goto RE;
}
}
else
{
Put_Str(str);
memset(str,0,20);
flag=0;
break;
}
};
break;
case('d'):
Put_Int(va_arg(arg_ptr,int));
break;
};
break;
default:
Put_Char(*format);
};
format++;
}
va_end(arg_ptr);
return 0;
}
int main()
{
int a=65535;
Print("%hhhh%hhhhd%d%hhhhh",a,a);
return 0;
}
[/code]
以上仅仅为解决引用中的题目问题,只对u,d进行了处理,而没有像printf那样处理其它的,有兴趣的可以自己去实现.