小甲鱼s1E29C语言动动手

0:

#include <stdio.h>

char *myitoa(int num, char *str);

char *myitoa(int num, char *str)
{
    int dec = 1; // 记录位数
    int i = 0; // 数组下标
    int temp; // 临时变量

    if (num < 0){
        str[i++] = '-'; // 给字符串的第一个字符添加为负号
        num = -num;
    }

    temp = num;

    while (temp > 9){
        dec *= 10;
        temp /= 10;
    }

    while (dec != 0){
        str[i++] = num / dec + '0';
        num = num % dec;
        dec /= 10;
    }

    return str;
}

int main()
{
    char str[10];

    printf("%s\n",myitoa(520,str));
    printf("%s\n",myitoa(-1234,str));

    return 0;
}

1:

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


int myprintf(char *format,...);
int countInt(int num);
void printInt(int num);
void printStr(char *str);


int myprintf(char *format,...)
{
    int i = 0;
    int count = 0;
    int darg; // 接收整数
    char carg; // 接收字符
    char *sarg; // 接收字符串
    va_list vap; // 定义指针变量

    va_start(vap,format); // 初始化vap指针
    while (format[i] != '\0'){ // 首先依次打印format,也就是调用myprintf函数时,括号内逗号以前的参数都是format
        if (format[i] != '%'){ // 判断是否需要进入格式化打印
            putchar(format[i++]);
            count++;
        } else {
            switch (format[i+1]) // format[i+1]就是判断%后面的字符是什么
            {
                case 'd':
                    {
                        darg = va_arg(vap,int); // 将int传给darg
                        printInt(darg);
                        count += countInt(darg);
                        break;
                    }
                case 'c':
                    {
                        carg = va_arg(vap,int);
                        putchar(carg); // 打印字符直接putchar就可以
                        count++;
                        break;
                    }
                case 's':
                    {
                        sarg = va_arg(vap,char *);
                        printStr(sarg);
                        count += strlen(sarg);
                        break;
                    }
            }
            i += 2; // 格式化打印的两个字符需要加上
        }
    }
    va_end(vap); // 重置vap指针变量
    return count;
}

// 统计整型数的位数
int countInt(int num)
{
    int count = 0;
    if (num < 0){
        count++;
        num = -num;
    }
    do {
        count++;
    } while (num /= 10);

    return count;
}

// 打印整数
void printInt(int num)
{
    int dec = 1; //步长
    int temp;

    if (num < 0){
        putchar('-');
        num = -num;
    }
    temp = num;
    
    while (temp > 9){
        dec *= 10;
        temp /= 10;
    }

    while (dec != 0){
        putchar(num / dec + '0');
        num %= dec;
        dec /= 10;
    }
}

// 打印字符串,通过指针实现一个字符一个字符的打印
void printStr(char *str)
{
    int i = 0;
    while (str[i] != '\0'){
        putchar(str[i++]);
    }
}

int main()
{
    int i;
    i = myprintf("Hello %s\n","FishC"); // count返回后被i接收,"FishC"是vap,"hello %s\n"是format,以下同理
    myprintf("共打印了%d个字符(包含\\n)\n",i);
    i = myprintf("int: %d, char: %c\n",-520,'H');
    // 这里有两个参数,并且不同类型,当执行到%d时,vap指向的是-520,当执行完-520后,vap会向后移动一个参数
    // 这时vap就指向了'H',所以在调用时,首先
    myprintf("共打印了%d个字符(包含\\n)\n",i);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GospeLLLLLL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值