gpt4 book ai didi

c - Linux C 在没有头库的情况下创建自定义 printf 函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:43:05 25 4
gpt4 key购买 nike

我正在为我正在为类分配工作的引导加载程序创建我自己的 prinf(),这意味着我必须使用 BCC 编译器并且我不能使用系统库,因为它们不存在。我确实有能力使用汇编中设计的 putc() 函数和字符串库函数 strcmp 等来根据需要帮助我。

我好像遇到了逻辑问题。

如果我在 Linux (cc) 上编译的测试文件中定义它:

int a = 0;
int b = 1;
int i1 = 0;
int i2 = 1;
unsigned long x = 42949672;
printf("\nHI! :%d: :%d: :%d: :%d: :%d: :%d:\n", x,a,b,i1,i2,x);

然后我可以运行 ./a.out 并收到 HI! :42949672: :0: :1: :0: :1::42949672: 这是正确的。

我已经创建了自己的 printf 函数,当我看到打印的东西时,我看到了 HI! :23592: :655: :0: :1: :0: :1:,这是不正确的。我试过只用整数打印,效果很好,但是当我尝试打印 unsigned long 时,我遇到了问题。

这是我的代码:

void prints(s) char *s;
{
int i;
for(i=0; i<strlen(s); i++)
putc(s[i]);
}

void gets(s) char *s;
{
//LEC9.pdf
while( (*s=getc()) != '\r')
{
putc(*s++);
}
*s = '\0';
}

//EXAMPLE CODE
char *ctable = "0123456789ABCDEF";
int rpi(x, BASE) unsigned long x; int BASE;
{
char c;
if (x)
{
c = ctable[x % BASE];
rpi(x / BASE, BASE);
putc(c);
}
return 0;
}

void printc(ip) unsigned long;
{
putc(ip);
}
int printd(ip) unsigned long;
{
if(ip < 0)
{
putc('-');
ip = -ip;
}
if(ip == 0)
{
putc('0');
return 0;
}
rpi(ip, 10);
}
void printx(ip) unsigned long;
{
prints("0x"); //PUT OR OUTPUT LOOK LIKE INT
rpi(ip, 16);
}
int printl(ip) unsigned long;
{
if(ip == 0)
{
putc('0');
return 0;
}
rpi(ip, 10);
putc('L');
}
void printf(fmt) char *fmt;
{
char *cp; //POINTER TO LOOP THROUGH
unsigned long *ip; //POINTER FOR

cp = fmt; //SET POINTER TO START POINTER {FMT}
ip = &fmt+1; //Board says &fmt:but will not work without +1

while(*cp)
{
//IF C != %
if(*cp != '%')
{
printf("%c", *cp);
if(*cp == '\n')
{
//putc('\n'); //implied
putc('\r');
}
cp++;
continue; //NEXT CHAR
}
else
{
//MOVE ONE CHARACTER (%{x}) SO WE CAN GET x
cp++;
switch(*cp)
{
case 'c':
printc(*ip);
break;
case 's':
prints(*ip);
break;
case 'd':
printd(*ip);
break;
case 'x':
printx(*ip);
break;
case 'l':
printl(*ip);
break;
default:
break;
} }
cp++;
ip++;
}
}

任何人都有任何提示,因为我一直被困并需要一些帮助。

编辑(下午 2:06):我已将所有 u16/unsigned short 更改为 unsigned long,并且已更改为打印 HI! :L: :0: :0::::::1:

最佳答案

这里有一个提示:

>>> hex(42949672)
'0x28f5c28'
>>> hex(23592)
'0x5c28'

在某个地方你使用了一个较短的类型。例如,我会检查您对 u16 的使用情况。

关于c - Linux C 在没有头库的情况下创建自定义 printf 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4845733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com