鱼C论坛

 找回密码
 立即注册
查看: 2858|回复: 8

模拟实现 printf 格式化输出的基本功能《小甲鱼课后作业

[复制链接]
发表于 2021-1-15 18:31:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
大佬们   小甲鱼课后作业
用可变参数实现 printf 格式化输出的基本功能  原题在图片里

这是我写的代码:
  1. #include <stdio.h>
  2. #include<string.h>
  3. #include<stdarg.h>
  4. void printfint(int);
  5. int numint(int );
  6. void printfstr(char *str);
  7. int numstr( char *str);
  8. int my_itoa(char *p,...);


  9. void printfint(int num)
  10. {
  11.      //int count=0;//只执行初始一次
  12.     if(num<0)
  13.     {
  14.         putchar('-');
  15.         num=-num;
  16.       
  17.     }
  18.     int temp=num;
  19.     int mu=1;
  20.     while(temp>9)
  21.     {
  22.         temp/=10;
  23.         mu*=10;//倍数
  24.     }
  25.     while(mu!=0)
  26.     {
  27.         putchar(num/mu+'0');
  28.         num%=mu;
  29.         mu/=10;
  30.     }
  31. }

  32. int numint(int num)
  33.     {
  34.         int i=0;
  35.         if (num<0)
  36.         {
  37.             i++;
  38.             num=-num;
  39.         }
  40.       
  41.         while(num!=0)
  42.         {
  43.             num/=10;
  44.             i++;
  45.         }
  46.         return i;
  47.     }

  48. void printfstr(char *str)
  49. {
  50.     int i=0;
  51.     while(str[i])
  52.     {
  53.         putchar(str[i]);
  54.         i++;
  55.     }
  56. }

  57. int numstr( char *str)
  58. {
  59.     int i=0;
  60.    
  61.     while(str[i])
  62.     {
  63.         i++;
  64.     }
  65.     return i;
  66. }

  67. int my_itoa(char *p,...)
  68.     {
  69.         int count=0,i=0;
  70.         int darg; char *sarg; char carg;//%d arg==darg
  71.         
  72.         va_list (mst);
  73.         va_start(mst,p);
  74.         
  75.        while(p[i])
  76.         {
  77.            if (p[i]!='%')
  78.            {
  79.                putchar(p[i]);
  80.                i++;
  81.                count++;
  82.            }
  83.             else
  84.             {
  85.                 switch(p[i+1])
  86.         {
  87.                     case'd':
  88.             {   darg=va_arg(mst, int);
  89.                     printfint(darg);
  90.                     count+= numint(darg);
  91.                     break;
  92.                 }
  93.               
  94.                 case 'c':
  95.             {      carg=va_arg(mst, int);
  96.                     putchar(carg); //为什么不能是char
  97.                     count++;
  98.                     break;
  99.                 }
  100.                     
  101.                     case 's':
  102.                     {
  103.                         sarg=va_arg(mst, char* );
  104.                         printfstr(sarg);
  105.                         count+=numstr(sarg);
  106.                         break;
  107.                     }
  108.                
  109.         }
  110.                
  111.             }
  112.             i+=2;
  113.         }
  114.         va_end(mst);
  115.         return count;
  116.         
  117.     }
  118.       
  119. int main()
  120.     {
  121.         int i;
  122.         i=my_itoa("我是小甲鱼%d\n",1314);
  123.         my_itoa("一共%d个字符\n",i);
  124.         return 0;
  125.         
  126.     }
复制代码



请问为什么打印出来是 :   
  1. \346\346\345\347\3511314
  2. \270\205d\252\227\246\344\34516\344\345\347
复制代码

哪里出错了呢


还有
  1. va_arg(,)
复制代码

第二个参数是什么意思。 int是获取可变参数形参列表里的对应的 int类型嘛
  1. carg=va_arg(mst, int);
复制代码
。那这里为什么不能是 va_arg(mst, char)。呢

助けてください ! 




原题

原题
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-1-15 20:01:12 | 显示全部楼层
誰かいるの
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-15 21:52:20 | 显示全部楼层

回答你的问题,还得先学日语,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-15 22:42:03 | 显示全部楼层
风过无痕1989 发表于 2021-1-15 21:52
回答你的问题,还得先学日语,

大佬你又来啦 帮我看看呗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-15 22:45:09 From FishC Mobile | 显示全部楼层
那个应该是十六进制字节码吧,要字符串输出
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-16 00:18:02 | 显示全部楼层
万千只cnm 发表于 2021-1-15 22:42
大佬你又来啦 帮我看看呗

不好意思,我今年花三个月到半年时间,学习 windows 编程,每天只回复十个帖子及一些简单的问题以维持升级所需积分,不再花时间去调试、探讨稍长或稍复杂的问题,请谅解!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-16 11:15:22 | 显示全部楼层
风过无痕1989 发表于 2021-1-16 00:18
不好意思,我今年花三个月到半年时间,学习 windows 编程,每天只回复十个帖子及一些简单的问题以维持升 ...

哦哦好的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-16 11:16:16 | 显示全部楼层
Minecraft程序猿 发表于 2021-1-15 22:45
那个应该是十六进制字节码吧,要字符串输出

啥意思
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-16 12:14:56 From FishC Mobile | 显示全部楼层
万千只cnm 发表于 2021-1-16 11:16
啥意思

你输出的没有被转为字符,而是直接输出了底层编码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-2 18:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表