c/c++字符串转化为数字问题----c语言stdlib库函数小结

c语言stdlib库函数小结

  • 前言因为刷题的时候经常遇到字符串转化为数字的问题,而c语言标准库中的stdlib库函数可以有效地解决这个问题。所以今天做个小结。因为c++是向下兼容c语言的,支持所有的c头文件,但是为了符合c++标准,所以c头文件都有一个c++版本的,去掉.h后缀,并在名字前加c。如这里<stdlib.h>要变成<cstdlib>。
  • stdlib库函数

        (1)atof函数:

        描述:double atof(const char *str)——把参数 str 所指向的字符串转换为一个浮点数(类型为 double 型)。函数返回转换后的双精度浮点数,如果没有执行有效的转换,则返回零(0.0)。

        代码:

#include<cstdio>
#include<cstdlib>
int main(){
    double f,f1;
    char ch[10]="1234.456";
    char ch1[10]="hello";
    f=atof(ch);
    f1=atof(ch1);
    printf("字符串=%s,浮点数值=%lf\n",ch,f);
    printf("字符串=%s,浮点数值=%lf",ch1,f1);
 return 0;
}

       结果:

 

       注意:这里有一点值得注意,atof函数参数要求传入字符型的指针变量,代表字符数组(因为c语言是没有原生的字符串类型的,一般都是用字符数组来代替)。数组名是指向数组首元素的地址,即数组名ch=&ch[0],所以f=atof(ch)可以写成f=atof(&ch[0])。

      (2)atoi函数:

       描述:int atoi(const char *str)——把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。函数返回转换后的整型值,如果没有执行有效的转换,则返回零(0)。

       代码:

#include<cstdio>
#include<cstdlib>
int main(){
    int i,i1;
    char ch[10]="1234.456";
    char ch1[10]="hello";
    i=atoi(&ch[0]);
    i1=atoi(&ch1[0]);
    printf("字符串=%s,整型值=%d\n",ch,i);
    printf("字符串=%s,整型值=%d",ch1,i1);
 return 0;
}

      结果:

     (3)atol函数:(同上)

       描述:long int atol(const char *str)——把参数 str 所指向的字符串转换为一个长整数(类型为 long int 型)。 不做过多赘述。

      (4)strtod函数:

        描述:double strtod(const char *str, char **endptr)——把参数 str 所指向的字符串转换为一个浮点数(类型为 double 型)。如果 endptr 不为空,则指向转换中最后一个字符后的字符的指针会存储在 endptr 引用的位置。该函数返回转换后的双精度浮点数,如果没有执行有效的转换,则返回零(0.0)。说得很拗口,看个例子就知道了。

       代码:

#include<cstdio>
#include<cstdlib>
int main(){
    double f,f1,f2,f3;
    char ch[30]="1234.456 hello world!";
     char ch1[20]="hello world! ";
     char ch2[20]="hello world! 123";
     char  ch3[20]="123456";
     char *ptr;
     char *ptr1;
      char *ptr2;
      char *ptr3;
     f=strtod(ch,&ptr);
    f1=strtod(ch1,&ptr1);
    f2=strtod(ch2,&ptr2);
    f3=strtod(ch3,&ptr3);
   //f3=strtod(ch3,NULL);
    printf("字符串=%s,浮点数值=%lf\n",ch,f);
    printf("字符串=%s,浮点数值=%lf\n",ch1,f1);
    printf("字符串=%s,浮点数值=%lf\n",ch2,f2);
     printf("字符串=%s,浮点数值=%lf\n",ch3,f3);
    printf("%s\n",ptr);
    printf("%s\n",ptr1);
    printf("%s\n",ptr2);
    printf("%s\n",ptr3);
    return 0;
}

       结果:

  

       注:其实字符串endptr指向所表示的浮点型数之后的部分,如果字符串全是浮点型数,那endptr所表示的字符串为null,也没有必要去定义字符指针去指向浮点数后面的位置,f3=strtod(ch3,NULL)这样调用函数即可。

    (5)strtol函数:

        描述:long int strtol(const char *str, char **endptr, int base)——把参数 str 所指向的字符串转换为一个长整数(类型为 long int 型)。参数 str 所指向的字符串根据给定的 base 转换为一个长整数(类型为 long int 型),base 必须介于 2 和 36(包含)之间,或者是特殊值 0。endptr 是对类型为 char* 的对象的引用,其值由函数设置为 str 中数值后的下一个字符。该函数返回转换后的长整数,如果没有执行有效的转换,则返回一个零值。

      代码:

#include<cstdio>
#include<cstdlib>
int main(){
    int i,i1;
    char *ptr;
    char *ptr1;
    char ch[30]="123456 hello world!";
     i=strtol(ch,&ptr,10);
     i1=strtol(ch,&ptr1,2);
    printf("字符串=%s,长整型值=%d\n",ch,i);
    printf("字符串=%s,长整型值=%d\n",ch,i1);
    printf("%s\n",ptr);
    printf("%s\n",ptr1);
    return 0;
}

     结果:实际上,基数就是进制,参数base代表采用的进制方式,base=0和base=10结果相同。但是假如base=2,也就是默认是二进制,二进制的世界只有0和1,则1后面的23456识别不了,认为和后面的hello world!都是除长整型数之外的字符串。如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值