gpt4 book ai didi

c - 使用 va_start 、 va_end va_arg 和系统调用的 printf 实现

转载 作者:太空宇宙 更新时间:2023-11-04 03:41:45 25 4
gpt4 key购买 nike

谁能告诉我如何使用 va_startva_end 实现 printfscanf va_arg 和系统调用读/写应该是什么样子?

我有这样的东西:

#include <stdio.h>
#include <stdarg.h>

char *translate(unsigned int, int);

void myprintf(char * frmt,...){
char *pointer;
int iterator;
char *s;
va_list argp;
va_start(argp, frmt);
pointer=frmt;

for(pointer=frmt; *pointer!='\0';pointer++){
if(*pointer!='%'){
putchar(*pointer);
continue;
}
pointer++;

switch(*pointer){
case 'd':
iterator=va_arg(argp,int);
if(iterator<0){
iterator=-iterator;
putchar('-');
}
puts(translate(iterator,10));
break;
case 's':
s=va_arg(argp,char *);
puts(s);
break;
//case 'b': b=va_arg(argp, );;break;
case 'x':
unsigned=va_arg(argp, unsigned int);
puts(translate(unsigned,16));
break;
case '%':
putchar('%');
break;
}
}
va_end(argp);
}

char *translate(unsigned int num, int base){
static char buff[33];
char *ptr;
ptr=&buff[sizeof(buff)-1];
*ptr='\0';
do{
*--ptr="0123456789abcdef"[num%base];
num/=base;
} while(num!=0);

return(ptr);
}

void main(){
void myprintf(char *,...);
char *translate(unsigned int, int);
int iterator=65;
char str[]="przyklad";
myprintf("\njbleble%s%d%x",str,iterator,iterator);
}

如何消除 putchar 并使用读/写?

最佳答案

以下是执行此操作的简单方法:

#define FD_STDOUT 1
void putchar(int c) {
char ch = c;
write(FD_STDOUT, &ch, 1);
}

这会将给定的字符写出到标准输出,而不使用 C 标准库的 IO 函数。但是,不要将它与 C 标准库的 IO 函数混合使用,因为这可能不起作用。

正如我所说,这有点天真:此解决方案可行,但您应该考虑以下情况以获得可靠的解决方案:

  • 如果系统调用提前返回(返回值为零)怎么办?当收到信号时可能会发生这种情况。
  • 如果 write 系统调用失败怎么办?您应该检查返回值。
  • 一次一个字符地写每个字符是低效的。您应该考虑缓冲您的输出。

关于c - 使用 va_start 、 va_end va_arg 和系统调用的 printf 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27911991/

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