Chinaunix首页 | 论坛 | 博客
  • 博客访问: 124818
  • 博文数量: 22
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 284
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-16 11:37
个人简介

不是一个称职的程序员……

文章分类

全部博文(22)

文章存档

2014年(15)

2013年(7)

我的朋友

分类: C/C++

2014-05-06 14:40:09

近期遇到一个问题就是,假设我有一个整形数组int a[3] = {1, 2, 3};
而我想以字符串的形式输出“123”,所以我想当然的写下了如下代码:
printf("%s\n", a);
结果是一堆乱码。
我又实验了一个字符数组char b[3] = {a, b, c};
printf("%s\n", b);
输出的内容是"abc+一些乱码"。
一个字符数组的输出内容是非常容易理解的,输出abc后由于没有结束字符'\0'所以发生了数组越界访问,从而输出乱码。
而整形数也可理解,它以4个字节存储整形数,然后按字节输出字符,肯定出错。
要想将一个整形数按字符串的形式输出,有很多可以调用的库函数
atof(将字符串转换成浮点型数)
atoi(将字符串转换成整型数)  
atol(将字符串转换成长整数数)                        
strtod(将字符串转换成浮点数)
strtol(将字符串转换成长整型数) 
strtoul(将字符串转换成无符号长整型数) 
toascii(将整型数转换成合法的ASCII 码字符)
toupper(将小写字母转换成大写字母)
tolower(将大写字母转换成小写字母)

itoa 

 

 

 

:

把一整数转换为字符串

 

 

 

 

:char *itoa(int value, char *string, int radix); 

 

 

详细解释

:itoa

是英文

integer 

to 

array(

int

整型数转化为一个字符串

,

并将值保存

在数组

string

)

的缩写

 

 

参数:

 

 

 

value: 

待转化的整数。

 

 

 

radix: 

是基数的意思

,

即先将

value

转化为

radix

进制的数,范围介于

2-36

,比如

10

表示

10

进制,

16

表示

16

进制。

 

 

 

* string: 

保存转换后得到的字符串。

 

 

 

返回值:

 

 

 

char * : 

指向生成的字符串,

 

*string

 

 

 

备注

:

该函数的头文件是

"stdlib.h"

itoa  
功 能:把一整数转换为字符串    
用 法:char *itoa(int value, char *string, int radix);  
详细解释:itoa是英文integer to array(将int整型数转化为一个字符串,并将值保存在数组string中)的缩写.  
参数:  
 value: 待转化的整数。    
radix: 是基数的意思,即先将value转化为radix进制的数,范围介于2-36,比如10表示10进制,16表示16进制。    
* string: 保存转换后得到的字符串。  
返回值:    char * : 指向生成的字符串, 同*string。  
备注:该函数的头文件是"stdlib.h"
atoi 
  C语言库函数名: atoi 
  功 能: 把字符串转换成整型数. 
  名字来源:array to integer 的缩写. 
  函数说明: atoi()会扫描参数nptr字符串,如果第一个字符不是数字也不是正负号返回零,否则开始做类型转换,之后检测到非数字或结束符 \0 时停止转换,返回整型数。

以上库函数有可能在某些操作系统或者环境中不可使用,我们按照函数说明自己实现一份代码便可。
********************************************************************************************************************
                                                 以下是网络中挑选的atoi和itoa的实现模板
********************************************************************************************************************

1, atoi

原型: int atoi(const char *nptr);

函数说明: 参数nptr字符串,如果第一个非空格字符不存在或者不是数字也不是正负号则返回零,否则开始做类型转换,之后检测到非数字(包括结束符 \0) 字符时停止转换,返回整型数。


#include
#include
static int atoi(const char* str)
{
    int result = 0;
    int sign = 0;
    assert(str != NULL);
    // proc whitespace characters
    while (*str==' ' || *str=='\t' || *str=='\n')
        ++str;
    // proc sign character
    if (*str=='-')
    {
        sign = 1;
        ++str;
    }
    else if (*str=='+')
    {
        ++str;
    }
    // proc numbers
    while (*str>='0' && *str<='9')
    {
        result = result*10 + *str - '0';
        ++str;
    }
    // return result
    if (sign==1)
       return -result;
    else
       return result;
}

2. itoa

char *itoaint value, char *string,int radix);

  原型说明:

  value欲转换的数据。

  string:目标字符串的地址。

  radix:转换后的进制数,可以是10进制、16进制等

char *itoa(int val, char *buf, unsigned radix)
{
    char   *p;             
    char   *firstdig;      
    char   temp;           
    unsigned   digval;     
    p = buf;
    if(val <0)
    {
        *p++ = '-';
        val = (unsigned long)(-(long)val);
    }
    firstdig = p; 
    do{
        digval = (unsigned)(val % radix);
        val /= radix;
       
        if  (digval > 9)
            *p++ = (char)(digval - 10 + 'a'); 
        else
            *p++ = (char)(digval + '0');      
    }while(val > 0);
   
    *p-- = '\0 ';         
    do{
        temp = *p;
        *p = *firstdig;
        *firstdig = temp;
        --p;
        ++firstdig;        
    }while(firstdig < p);  
    return buf;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

DE>#include<stdio.h>
int atoi(const char *str)
{
    int value=0;
    bool b_plus=true; //判断符号

    switch(*str) //过滤符号

    {
    case '+':
        str++;
        break;
    case '-':
        b_plus=false;
        str++;
        break;
    default:
        break;
    }

    while('\0' != *str)
    {
        value = (value*10)+(*str-'0');
        str++;
    }
    if(!b_plus)
        value=-value;
    return value;
}

void main()
{
    char str[]="-999";
    int value=atoi(str);
    printf("The result is:%d\n",value);
}



DE>#include<stdio.h>
void itoa(int value, char *str)
{
    if (value < 0) //如果是负数,则str[0]='-',并把value取反(变成正整数)

    {
        str[0] = '-';
        value = 0-value;
    }
    int i,j;
    for(i=1; value > 0; i++,value/=10) //从value[1]开始存放value的数字字符,不过是逆序,等下再反序过来

        str[i] = value%10+'0'; //将数字加上0的ASCII值(即'0')就得到该数字的ASCII值

    for(j=i-1,i=1; j-i>=1; j--,i++) //将数字字符反序存放

    {
        str[i] = str[i]^str[j];
        str[j] = str[i]^str[j];
        str[i] = str[i]^str[j];
    }
    if(str[0] != '-') //如果不是负数,则需要把数字字符下标左移一位,即减1

    {
        for(i=0; str[i+1]!='\0'; i++)
            str[i] = str[i+1];
        str[i] = '\0';
    }
}

void main()
{
    int value = -1212345;
    char str[10] = {'\0'}; //记得把str全填充为'\0'

    itoa(value, str);
    printf("The result is:%s\n", str);
}


阅读(2285) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~