C语言字符串与数字之间的相互转换

在C/C++语言中没有专门的字符串变量,通常用字符数组来存放字符串。字符串是以“\0”作为结束符。C/C++提供了丰富的字符串处理函数,下面列出了几个最常用的函数。
● 字符串输出函数 puts。
● 字符串输出函数 gets。
● 字符串连接函数 strcat。
● 字符串复制函数 strcpy。
● 测字符串长度函数 strlen。
其中包括了许多知识点,例如内存越界、指针与数组操作等。
许多公司在面试时会要求应聘者写一段复制字符串或字符串子串操作的程序。
6.1 数字与字符串的转化
应聘时经常出现数字与字符串之间转化的问题,面试官通过这类题目来考察应聘者能力,例如是否熟悉常用的库函数,是否了解ASCII码以及是否了解字符串的存储格式等。
重点内容:使用库函数将数字转化为字符串
面试例题1:使用库函数将数字转换为字符串。
考点:C库函数中数字转换为字符串的使用。
出现频率:★★★
解析
C语言提供了几个标准库函数,可以将任意类型(整型、长整型、浮点型等)的数字转换为字符串,下面列举了各函数的方法及其说明。
● itoa():将整型值转换为字符串。
itoa是一个可以将整数转换为字符串的函数,配合textout函数可以方便的输出数字,使用方法如下:
用法:char *itoa(int value, char *string, int radix);
将整数value转换成字符串存入string,
radix为转换时所用基数(保存到字符串中的数据的进制基数2、8、10、16)
● ltoa():将长整型值转换为字符串。
● ultoa():将无符号长整型值转换为字符串。
● gcvt():将浮点型数转换为字符串,取四舍五入。
● ecvt():将双精度浮点型值转换为字符串,转换结果中不包含十进制小数点。
● fcvt():指定位数为转换精度,其余同ecvt()。
还可以使用sprintf系列函数把数字转换成字符串,其比itoa()系列函数运行速度慢。下列程序演示了如何使用itoa()函数和gcvt()函数:
itoa()函数演示将长整型值转换为字符串:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int num_int=435; //整数型数据
    char str_int[30];
    itoa(num_int,str_int,10);
    printf("str_int: %s\n", str_int);
    return 0;
}

gcvt():将浮点型数转换为字符串,取四舍五入。gcvt()函数:
定义函数:char *gcvt(double number, size_t ndigits, char *buf);
函数说明:gcvt()用来将参数number 转换成ASCII 码字符串,
参数ndigits 表示显示的位数。
gcvt()与ecvt()和fcvt()不同的地方在于,gcvt()所转换后的字符串包含小数点或正负符号。
若转换成功,转换后的字符串会放在参数buf 指针所指的空间。
返回值:返回一字符串指针,此地址即为buf 指针。

#include <stdio.h>
#include <stdlib.h>
int main()
{
    double num_double=435.10f;//浮点型数据
    char str_double[30];
    gcvt(num_double,8,str_double);//把浮点数num_double转换为str_double
    printf("str_double: %s\n", str_double);
    return 0;
}

面试例题2:不使用库函数将整数转换为字符串。
考点:数字转换为字符串,理解相关ASCII码。
如果不使用atoi或sprintf等库函数,可以通过把整数的各位上的数字加“0”转换成char类型并存到字符数组中。但是要注意,需要采用字符串逆序的方法。如以下程序所示:
知识点补充:
C语言运算符中问号是条件运算符(与冒号组合)。该运算符是C语言中唯一一个三目运算符。

max = a>b ? a : b;   // 如果a>b,则max的值为a,否则max的值为b,也即取a与b中的较大者

如果不使用atoi或sprintf等库函数,可以通过把整数的各位上的数字加“0”转换成char类型并存到字符数组中。但是要注意,需要采用字符串逆序的方法。如以下程序所示:

#include <stdio.h>
#include <stdlib.h>
void int2str(int n, char *str)
{
    char buf[10] = "";
    int i = 0;
    int len = 0;
    int temp = n < 0 ? -n: n;  // temp为n的绝对值
    //把参数n的绝对值赋给temp,
    //以后在计算各个位的整数时用temp,这样保证在负数情况下取余不会出现问题。
    if (str == NULL)//判断str的有效性,str不为NULL。
    {
        return;
    }
    //while循环中,将n的各个位存放到局部数组buf中,存放的顺序与整数顺序相反。
    //例如n为整数123 456,while循环结束后buf应为“654 321”。
    while(temp)
    {
        buf[i++] = (temp % 10) + '0';  //把temp的每一位上的数存入buf
        temp = temp / 10;
    }
    len = n < 0 ? ++i: i;  //如果n是负数,则多需要一位来存储负号
    str[i] = 0;            //末尾是结束符0
    while(1)
    {
        i--;
        if (buf[len-i-1] ==0)
        {
            break;
            //代码第22~第31行把数组buf中的非0元素逆向复制到参数str指向的内存中,
            //如果n是负数,则str指向的第一个内存存放负号。
        }
        str[i] = buf[len-i-1];  //把buf数组里的字符拷到字符串
    }
    if (i == 0 )
    {
        str[i] = '-';          //如果是负数,添加一个负号
    }
}
int main()
{
    int nNum=100;
    char p[10];
    int2str(nNum, p);        //整型转换成字符串
    printf("p: %s\n", p);
    printf("%d",strlen(p)); //显示3个字节
    return 0;
}

6.1.2 字符串转化为数字
面试例题3:使用库函数将字符串转换为数字。
考点:C库函数中字符串转换为数字的使用。
出现频率:★★★★
解析
与上节数字转换为字符串类似,C/C++语言提供了几个标准库函数,可以将字符串转换为任意类型(整型、长整型、浮点型等)。以下列举了各函数的方法及其说明。
● atof():将字符串转换为双精度浮点型值。
● atoi():将字符串转换为整型值。
● atol():将字符串转换为长整型值。
● strtod():将字符串转换为双精度浮点型值,并报告不能被转换的所有剩余数字。
● strtol():将字符串转换为长整值,并报告不能被转换的所有剩余数字。
● strtoul():将字符串转换为无符号长整型值,并报告不能被转换的所有剩余数字。
程序演示如何使用atoi ()函数和atof ()函数

#include <stdio.h>
#include <stdlib.h>
int main ()
{
    int num_int;
    double num_double;
    char str_int[30] = "435";         //将要被转换为整型的字符串
    char str_double[30] = "436.55";  //将要被转换为浮点型的字符串
    num_int = atoi(str_int);          //转换为整型值
    num_double = atof(str_double);  //转换为浮点型值
    printf("num_int: %d\n", num_int);
    printf("num_double: %lf\n", num_double);
    return 0;
 }

面试例题4:不使用库函数将字符串转换为数字。
考点:字符串转换为数字时,对相关ASCII码的理解。
出现频率:★★★★

#include <stdio.h>
#include <stdlib.h>
int str2int(const char *str)
{
    int temp = 0;
    const char *ptr = str;  //ptr保存str字符串开头
    if (*str == '-' || *str == '+')  //如果第一个字符是正负号,
    {//则移到下一个字符
    str++;
    }
    while(*str != 0)
    {
        if ((*str < '0') || (*str > '9'))  //如果当前字符不是数字
        {                       //则退出循环
        break;
        }
        temp = temp * 10 + (*str - '0'); //如果当前字符是数字则计算数值
        str++;      //移到下一个字符
    }
    if (*ptr == '-')     //如果字符串是以“-”开头,则转换成其相反数
    {
        temp = -temp;
    }
    return temp;
}
int main()
{
    int n = 0;
    char p[10] = "1234";
    n = str2int(p);      //把字符串转换成整型数
    printf("%d",n);
    return 0;
}

程序中的str2int函数作用是将字符串转换成整数。这个函数的转换过程与例题2中的int2str函数相比更加简单,它只需要做一次while循环就能把数值大小计算出来,如果结果是负数,就加一个负号。
——这里写代码片—-
参考网址:
1.http://www.cnblogs.com/sddai/p/5774121.html
2.http://blog.chinaunix.net/uid-11480268-id-2872719.html
3.http://www.jb51.net/article/71485.htm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值