atoi 和 itoa 还有sprintf的使用

蹲街弑〆低调 提交于 2019-12-21 01:57:56

目的是为了让字符数组中16进制数,以字符串的实现体现:

int atoi(const char *nptr);

int atoi(const char *nptr);
atoi 把字符数据转换为int类型

char *itoa (int value, char *str, int base );

返回值:返回指向str的指针,无错误返回。 [2]
int value 被转换的整数,char *string 转换后储存的字符数组,int radix 转换进制数,如2,8,10,16 进制等,大小应在2-36之间
itoa 如何要在liunx中使用要添加源码程序,库里现在没有这个函数

int sprintf(char *string, char *format [,argument,…]);

  • string-- 这是指向一个字符数组的指针,该数组存储了 C 字符串。
  • format-- 这是字符串,包含了要被写入到字符串 str 的文本。它可以包含嵌入的 format 标签,format
    标签可被随后的附加参数中指定的值替换,并按需求进行格式化。format
    标签属性是%[flags][width][.precision][length]specifier
  • [argument]…:根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了
    format 参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。

把argument以format 的类型添加到string中去

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>

char* itoa(int num,char* str,int radix)
{/*索引表*/
    char index[]="0123456789ABCDEF";
    unsigned unum;/*中间变量*/
    int i=0,j,k;
    /*确定unum的值*/
    if(radix==10&&num<0)/*十进制负数*/
    {   
        unum=(unsigned)-num;
        str[i++]='-';
    }   
    else unum=(unsigned)num;/*其他情况*/
    /*转换*/
    do{ 
        str[i++]=index[unum%(unsigned)radix];
        unum/=radix;
       }while(unum);
    str[i]='\0';
    /*逆序*/
    if(str[0]=='-')
        k=1;/*十进制负数*/
    else
        k=0;
    
    for(j=k;j<=(i-1)/2;j++)
    {       char temp;
        temp=str[j];
        str[j]=str[i-1+k-j];
        str[i-1+k-j]=temp;
    }   
    return str;
}
int main()
{
        char *s = "123";
        int data;
        int i = 0;
        int number = 87;    
        int number1 = 0x00;
        int len;    
        char string[25];    
        char string1[25];
        int buf[] = {0x02, 0x30, 0x5a, 0x67, 0x00, 0x89, 0x01}; 
        char buf1[25] = {}; 
        char buf_data[1024] = {}; 
        char single[] = "0";
    
        len = sizeof(buf) / sizeof(buf[0]);

        data = atoi(s); 
        printf("%d\n", data);

        itoa(number, string, 10);
        printf("%s\n", string);

        itoa(number1, string1, 16);
        printf("%s\n", string1);
   
        for(i = 0; i < len; i++)
        {

                itoa(buf[i], buf1, 16);
                printf("%s\n", buf1);
                if(strlen(buf1) == 1) {
                        strcat(single, buf1);
                        strcat(buf_data, single);
                } else {
                        strcat(buf_data, buf1);
                }
                memset(buf1, 0, sizeof(buf1));
        }
        printf("%s\n", buf_data);

}

kayshi@ubuntu:~/code$ ./atoi_itoa 
123
87
0
2
30
5A
67
0
89
1
02305A67020890201

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>

char* itoa(int num,char* str,int radix)
{/*索引表*/
    char index[]="0123456789ABCDEF";
    unsigned unum;/*中间变量*/
    int i=0,j,k;
    /*确定unum的值*/
    if(radix==10&&num<0)/*十进制负数*/
    {   
        unum=(unsigned)-num;
        str[i++]='-';
    }   
    else unum=(unsigned)num;/*其他情况*/
    /*转换*/
    do{ 
        str[i++]=index[unum%(unsigned)radix];
        unum/=radix;
       }while(unum);
    str[i]='\0';
    /*逆序*/
    if(str[0]=='-')
        k=1;/*十进制负数*/
    else
        k=0;
    
    for(j=k;j<=(i-1)/2;j++)
    {       char temp;
        temp=str[j];
        str[j]=str[i-1+k-j];
        str[i-1+k-j]=temp;
    }
    return str;
}


int main()
{
        char buf[]={0x10, 0x01, 0x34, 0x56, 0x00, 0x00, 0x78, 0x23};
        char buf1[100]={};
        char f[]="%";
        char data[100];
        char data1[100];

        int i;

        for(i=0; i<sizeof(buf); i++){
                strcat(buf1, f);
                itoa(buf[i], data, 16);
                strcat(buf1, data);
        }
        printf("%s\n", buf1);

        for(i=0; i<sizeof(buf); i++){
                sprintf(data1+(i*3), "%%%02x", buf[i]);
        }
        printf("%s\n", data1);
}

结果

kayshi@ubuntu:~/code$ ./test11
%10%1%34%56%0%0%78%23
%10%01%34%56%00%00%78%23
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!