注意:在ecplise下使用CDT开发C/C++程序中,使用debug调试时,到了printf 打印函数,在console窗口中并没有打印出信息来,停止后才会有输出。原因是:在debug调试时, eclipse 将输出的内容存放到了输出缓存区中,没有及时的输出到控制台。等到调试结束时,再将所有的信息一并打印出来。
解决方法:推荐使用:在程序开始时设置缓冲区类型,setvbuf函数在stdio.h文件声明。
setvbuf(stdout,NULL,_IONBF,0);
函数原型:
函数名: setvbuf
头文件:stdio.h
用 法: int setvbuf(FILE *stream, char *buf, int type, unsigned size);
type : 期望缓冲区的类型:
_IOFBF(满缓冲):当缓冲区为空时,从流读入数据。或者当缓冲区满时,向流写入数 据。
_IOLBF(行缓冲):每次从流中读入一行数据或向流中写入一行数据。
_IONBF(无缓冲):直接从流中读入数据或直接向流中写入数据,而没有缓冲区。
size : 缓冲区内字节的数量。
代码如下:
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#define SELECT_RECURSION_ALG
int Decimal2Str(int in, char *str)
{
int mod, div;
int sign = 0;
char buf[100] = {0};
int offset = sizeof(buf) - 1;
char *pos = buf + offset;
*(pos--) = '\0';
sign = (in < 0) ? -1 : 1;
div = sign * in;
do{
mod = div % 10;
div = div / 10;
*(pos--) = '0' + mod;
}while(div != 0);
if( in < 0 ) *(pos--) = '-';
memcpy(str, pos + 1, strlen(pos + 1));
return strlen(pos + 1);
}
int Hex2Str(int in, char *str)
{
#ifndef SELECT_RECURSION_ALG
int mod, div;
int sign = 0;
char buf[100] = {0};
int offset = sizeof(buf) - 1;
char *pos = buf + offset;
if(in < 0) return 0;
*(pos--) = '\0';
div = in;
do{
mod = div % 16;
div = div / 16;
if(mod > 9)
*(pos--) = '7' + mod;
else
*(pos--) = '0' + mod;
}while(div != 0);
memcpy(str, pos + 1, strlen(pos + 1));
return strlen(pos + 1);
#else
int index = 0;
if(0 >= in) return index;
int mod = in % 16, div = in / 16;
index += Hex2Str(div, str);
if(mod > 9)
*(str + index++) = mod + '7';
else
*(str + index++) = mod + '0';
return index;
#endif
}
int Float2Str(double in, char *str)
{
int integer = (int)in;
int index = Decimal2Str(integer, str);
*(str + index++) = '.';
double fractional = in - integer;
int fractional2Integer = (int)(fractional * 1000000);
index += Decimal2Str(fractional2Integer, str + index);
return index;
}
int Decimal2BinaryStr(int in, char *str)
{
int index = 0;
if(0 == in) return index;
index += Decimal2BinaryStr(in / 2, str);
*(str + index++) = (char)(in % 2) + '0';
return index;
}
void MyPrintf(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
char buf[256] = {0};
int index = 0;
int i = 0;
while(*fmt)
{
if(*fmt != '%')
{
buf[index++] = *fmt;
}
else
{
switch(*(++fmt))
{
case 'b':
case 'B':
{
int d = va_arg(args, int);
int l = Decimal2BinaryStr(d, buf + index);
index += l;
break;
}
case 'c':
case 'C':
{
char c = va_arg(args, int);
buf[index++] = c;
break;
}
case 'f':
case 'F':
{
double f = va_arg(args, double);
int l = Float2Str(f, buf + index);
index += l;
break;
}
case 'd':
case 'D':
{
int d = va_arg(args, int);
int l = Decimal2Str(d, buf + index);
index += l;
break;
}
case 'x':
case 'X':
{
int h = va_arg(args, int);
int l = Hex2Str(h, buf + index);
index += l;
break;
}
case 's':
case 'S':
{
char *s = va_arg(args, char *);
strcpy(buf + index , s);
index += strlen(s);
break;
}
default:
printf("dont support\n");
break;
}
}
fmt++;
}
buf[index++] = '\0';
va_end(args);
for(i = 0; i < index; ++i)
{
putchar(buf[i]);
}
}
void MyNewPrintf(const char *fmt, ...)
{
va_list ap;//定义一个指针变量
unsigned int size = 0;
char buf[256] = {0};
va_start(ap, fmt);
size = vsnprintf(buf, sizeof(buf), fmt, ap);
va_end (ap);
for(int i = 0; i < size; ++i)
{
putchar(buf[i]);
}
}
int main(int argc, char *argv[])
{
printf("=============> MyPrintf <================\n");
int a = -1;
if(a < 0) printf("this is -1 < 0 %d\n", 1);
else printf("this is -1 > 0 %d\n", 0);
// MyPrintf("test char %c\n", 'd');
// MyPrintf("test data0 %d\n", 0);
// MyPrintf("test data5 %d\n", 5);
// MyPrintf("test data10 %d\n", 10);
// MyPrintf("test data100 %d\n", 100);
MyPrintf("test data999 %d\n", 999);
MyPrintf("test data-999 %d\n", -999);
// MyPrintf("test data-0 %d\n", -0);
MyPrintf("test data0x999 0x%x\n", 0x999);
MyPrintf("test data0x888888 0x%x\n", 0x888888);
MyPrintf("test data0xA8C8F8 0x%x\n", 0xA8C8F8);
MyPrintf("test data200 0x%x\n", 200);
MyPrintf("test data0x888888 %s\n", "data0x888888");
MyPrintf("test data12345678.1234567 %f data0xA8C8F8 0x%x\n", 12345678.1234567, 0xA8C8F8);
MyPrintf("test data5 0b%b 0b%b\n", 5, 0xA);
printf("=============> MyNewPrintf <================\n");
MyNewPrintf("test data999 %d\n", 999);
MyNewPrintf("test data-999 %d\n", -999);
// MyNewPrintf("test data-0 %d\n", -0);
MyNewPrintf("test data0x999 0x%x\n", 0x999);
MyNewPrintf("test data0x888888 0x%x\n", 0x888888);
MyNewPrintf("test data0xA8C8F8 0x%x\n", 0xA8C8F8);
MyNewPrintf("test data200 0x%x\n", 200);
MyNewPrintf("test data0x888888 %s\n", "data0x888888");
MyNewPrintf("test data12345678.1234567 %f data0xA8C8F8 0x%x\n", 12345678.1234567, 0xA8C8F8);
return 0;
}
打印结果:
=============> MyPrintf <================
this is -1 < 0 1
test data999 999
test data-999 -999
test data0x999 0x999
test data0x888888 0x888888
test data0xA8C8F8 0xA8C8F8
test data200 0xC8
test data0x888888 data0x888888
test data12345678.1234567 12345678.123456 data0xA8C8F8 0xA8C8F8
test data5 0b101 0b1010
=============> MyNewPrintf <================
test data999 999
test data-999 -999
test data0x999 0x999
test data0x888888 0x888888
test data0xA8C8F8 0xa8c8f8
test data200 0xc8
test data0x888888 data0x888888
test data12345678.1234567 12345678.123457 data0xA8C8F8 0xa8c8f8