26.实现printf

本文详细介绍了如何实现C语言中的printf函数,从printf的基础概念出发,解析了vsprintf如何处理格式化字符串,以及简易write系统调用的实现步骤。通过va_start、va_arg和va_end宏管理可变参数,最后阐述了printf调用vsprintf和write完成输出的整个流程。
摘要由CSDN通过智能技术生成

1.printf是什么?

printf是c语言的标准输出函数,原型是

int printf(const char *format, …);

其中format 是格式化字符串,其中就包含“%类型字符”.
“…”是可变参数,参数不固定。

printf 由两个函数封装而成,一个是 vsprintf ,另一个是 write。
vsprintf 负责把 format 中的%d、%s、%c……给替换成真正的样子,用后面的参数来替换。
write 负责把替换号的字符串打印输出到屏幕上。

2.实现 vsprintf

#define va_start(ap, v) ap = (va_list)&v  // 把ap指向第一个固定参数v
#define va_arg(ap, t) *((t*)(ap += 4))	  // ap指向下一个参数并返回其值
#define va_end(ap) ap = NULL		  // 清除ap

/* 将整型转换成字符(integer to ascii) */
static void itoa(uint32_t value, char** buf_ptr_addr, uint8_t base) {
   
   uint32_t m = value % base;	    // 求模,最先掉下来的是最低位   
   uint32_t i = value / base;	    // 取整
   if (i) {
   			    // 如果倍数不为0则递归调用。
      itoa(i, buf_ptr_addr, base);
   }
   if (m < 10) {
         // 如果余数是0~9
      *((*buf_ptr_addr)++) = m + '0';	  // 将数字0~9转换为字符'0'~'9'
   } else {
   	      // 否则余数是A~F
      *((*buf_ptr_addr)++
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
幸运26是一种猜数字的游戏,游戏规则如下: 1. 系统随机生成1到26之间的一个幸运数字。 2. 玩家输入一个猜测数字,范围也是1到26。 3. 系统判断玩家猜测的数字与幸运数字的大小关系: - 如果玩家猜测的数字与幸运数字相等,游戏胜利,输出“恭喜你猜对了!”。 - 如果玩家猜测的数字大于幸运数字,系统提示“太大了,请重新猜测。” - 如果玩家猜测的数字小于幸运数字,系统提示“太小了,请重新猜测。” 4. 玩家可以继续输入新的猜测数字,直到猜对为止。 为了实现幸运26游戏的程序,我们可以使用C语言来编写。 首先,我们需要使用rand()函数生成1到26之间的随机数作为幸运数字。可以使用rand() % 26 + 1来实现这个功能。 然后,我们使用scanf()函数接收玩家输入的猜测数字,并将其存储在一个变量中。 接下来,使用if语句来判断玩家猜测数字与幸运数字的大小关系。如果相等,输出胜利的信息并结束程序。如果不相等,则通过提示语句告诉玩家继续猜测,并重新接收玩家输入的猜测数字。 最后,使用循环结构,让玩家可以多次猜测,直到猜对。 下面是一个简单实现幸运26游戏的C程序示例: ``` #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { srand(time(0)); int luckyNumber = rand() % 26 + 1; int guess; printf("欢迎来到幸运26游戏!\n"); printf("请猜测一个1到26之间的数字:\n"); do { scanf("%d", &guess); if (guess == luckyNumber) { printf("恭喜你猜对了!\n"); break; } else if (guess > luckyNumber) { printf("太大了,请重新猜测。\n"); } else { printf("太小了,请重新猜测。\n"); } } while (1); return 0; } ``` 以上是一个基本实现幸运26游戏的C语言程序示例。每次运行程序时,幸运数字都会随机生成。玩家根据系统的提示,输入自己的猜测数字,直到猜中为止。祝你好运!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值