鱼C论坛

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

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

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

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

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

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

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


void printfint(int num)
{
     //int count=0;//只执行初始一次
    if(num<0)
    {
        putchar('-');
        num=-num;
       
    }
    int temp=num;
    int mu=1;
    while(temp>9)
    {
        temp/=10;
        mu*=10;//倍数
    }
    while(mu!=0)
    {
        putchar(num/mu+'0');
        num%=mu;
        mu/=10;
    }
}

int numint(int num)
    {
        int i=0;
        if (num<0)
        {
            i++;
            num=-num;
        }
       
        while(num!=0)
        {
            num/=10;
            i++;
        }
        return i;
    }

void printfstr(char *str)
{
    int i=0;
    while(str[i])
    {
        putchar(str[i]);
        i++;
    }
}

int numstr( char *str)
{
    int i=0;
    
    while(str[i])
    {
        i++;
    }
    return i;
}

int my_itoa(char *p,...)
    {
        int count=0,i=0;
        int darg; char *sarg; char carg;//%d arg==darg
        
        va_list (mst);
        va_start(mst,p);
        
       while(p[i])
        {
           if (p[i]!='%')
           {
               putchar(p[i]);
               i++;
               count++;
           }
            else
            {
                switch(p[i+1])
        {
                    case'd':
            {   darg=va_arg(mst, int);
                    printfint(darg);
                    count+= numint(darg);
                    break;
                }
              
                case 'c':
            {      carg=va_arg(mst, int);
                    putchar(carg); //为什么不能是char
                    count++;
                    break;
                }
                    
                    case 's':
                    {
                        sarg=va_arg(mst, char* );
                        printfstr(sarg);
                        count+=numstr(sarg);
                        break;
                    }
                
        }
                
            }
            i+=2;
        }
        va_end(mst);
        return count;
        
    }
      
int main()
    {
        int i;
        i=my_itoa("我是小甲鱼%d\n",1314);
        my_itoa("一共%d个字符\n",i);
        return 0;
        
    }


请问为什么打印出来是 :   
\346\346\345\347\3511314
\270\205d\252\227\246\344\34516\344\345\347
哪里出错了呢


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

助けてください ! 




原题

原题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-1-15 20:01:12 | 显示全部楼层
誰かいるの
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回答你的问题,还得先学日语,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

大佬你又来啦 帮我看看呗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-15 22:45:09 From FishC Mobile | 显示全部楼层
那个应该是十六进制字节码吧,要字符串输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

哦哦好的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

啥意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你输出的没有被转为字符,而是直接输出了底层编码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 04:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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