C标准库--<stdlib.h>库函数应用解析

本文详细介绍了C语言中的字符串转换函数atof,atoi,atol,strtod,strtol和strtoul的用法,展示了如何将字符串转换为浮点数、整数和长整数,以及它们的返回值处理和错误处理机制。
摘要由CSDN通过智能技术生成

1)atof()

double atof(const char *str)把参数str指向的字符串转换为一个浮点数(类型double)

/* 函数声明 */
double atof(const char *str)

参数:

  • str:要转换为浮点数的字符串。

返回值:函数返回转换后的双精度浮点数,如果没有执行有效的转换,则返回0.0。

实例:演示了atof()函数的用法。

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

int main(int argc, char** argv)
{
        float val;
        char str[21];

        if (argc != 2){
                printf("Usage: %s <string_to_float>\n", argv[0]);
                exit(1);
        }

        if (strlen(argv[1]) >= 20){
                printf("string_to_float string is too long\n");
                exit(1);
        }

        strcpy(str, argv[1]);
        val = atof(str);

        printf("string = %s, float value: %f\n", str, val);

        return 0;
}

编译以上代码,在命令行中测试:

orangepi@orangepi4-lts:~/host_program/host/hostApp/O.linux-aarch64$ ./test_atof 12.34
string = 12.34, float value: 12.340000
orangepi@orangepi4-lts:~/host_program/host/hostApp/O.linux-aarch64$ ./test_atof 12.34abc
string = 12.34abc, float value: 12.340000
orangepi@orangepi4-lts:~/host_program/host/hostApp/O.linux-aarch64$ ./test_atof abc12.34
string = abc12.34, float value: 0.000000

2) atoi()

int atoi(const char * str)把参数str指向的字符串转换为一个整数(类型int)。

/* 函数声明 */
int atoi(const char *str);

参数:

  • str:要转换为整数的字符串。

返回值:改函数返回转换后的整数,如果没有执行有效的转换,则返回0。

实例:演示了atof()函数的用法

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

int main(int argc, char** argv)
{
        int val;
        char str[21];

        printf("size of int is %ld\n", sizeof(int));

        if (argc != 2){
                printf("Usage: %s <string_to_int>\n", argv[0]);
                exit(1);
        }

        if (strlen(argv[1]) >= 20){
                printf("string_to_int string is too long\n");
                exit(1);
        }

        strcpy(str, argv[1]);
        val = atoi(str);

        printf("string = %s, int value: %d\n", str, val);
        return 0;
}

编译以上代码并在命令行中测试: 

orangepi@orangepi4-lts:~/host_program/host/hostApp/O.linux-aarch64$ ./test_atoi 123
size of int is 4
string = 123, int value: 123
orangepi@orangepi4-lts:~/host_program/host/hostApp/O.linux-aarch64$ ./test_atoi 123xxx
size of int is 4
string = 123xxx, int value: 123
orangepi@orangepi4-lts:~/host_program/host/hostApp/O.linux-aarch64$ ./test_atoi xxx123
size of int is 4
string = xxx123, int value: 0

3)atol()

long int atol(const char * str)把参数str指向的字符串转换为一个长整数(类型为long int型)。

/* 函数声明 */
long int atol(const char * str);

参数:

  • str:要转换为长整数的字符串。

返回值:该函数返回转换后的长整数,如果没有执行有效的转换,则返回0。

实例:显示了atol()函数的用法。

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

int main(int argc, char** argv)
{
        long int val;
        char str[21];

        printf("size of int is %ld\n", sizeof(int long));

        if (argc != 2){
                printf("Usage: %s <string_to_int>\n", argv[0]);
                exit(1);
        }

        if (strlen(argv[1]) >= 20){
                printf("string_to_int string is too long\n");
                exit(1);
        }

        strcpy(str, argv[1]);
        val = atol(str);

        printf("string = %s, int value: %ld\n", str, val);
        return 0;
}

编译以上源代码并且在命令行中测试:

orangepi@orangepi4-lts:~/host_program/host/hostApp$ O.linux-aarch64/test_atol 1234567891256789
size of int is 8
string = 1234567891256789, int value: 1234567891256789
orangepi@orangepi4-lts:~/host_program/host/hostApp$ O.linux-aarch64/test_atol 1234567891256789xx
size of int is 8
string = 1234567891256789xx, int value: 1234567891256789
orangepi@orangepi4-lts:~/host_program/host/hostApp$ O.linux-aarch64/test_atol xx1234567891256789
size of int is 8
string = xx1234567891256789, int value: 0

4)strtod()

double strtod(const char * str, char ** endptr)把参数str所指向的字符串转换为一个浮点数(类型double型)。如果endptr不为空,则指向转换中最后一个字符后的指针会存储在endptr引用中。

/* 函数声明 */
double strtod(const char *str, char **endptr);

参数:

  • str:要转换为双精度浮点的字符串。
  • endptr:其值由函数设置为str中数值后下一个字符。

返回值:该函数返回转换后的双精度浮点数,如果没有执行有效的转换,则返回零(0.0)。

实例:演示strtod()函数的用法。

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

int main(int argc, char ** argv)
{
        char str[51] = "    20.3000  10.3  20.5 ";
        char * ptr1, * ptr2;
        double ret;

        ptr2 = str;

        while (* ptr2 != '\0'){
                while (* ptr2 == ' '){
                        ptr2++;
                        if (* ptr2 == '\0'){
                                goto EXIT;
                        }
                }

                printf("before strtod: %s\n", ptr2);

                ptr1 = ptr2;
                ret = strtod(ptr1, &ptr2);
                printf("double value: %lf\n", ret);
                printf("after strtod: %s\n\n", ptr2);

        }
EXIT:
        return 0;
}

编译并且运行以上程序:

orangepi@orangepi4-lts:~/host_program/host/hostApp$ O.linux-aarch64/test_strtod
before strtod: 20.3000  10.3  20.5
double value: 20.300000
after strtod:   10.3  20.5

before strtod: 10.3  20.5
double value: 10.300000
after strtod:   20.5

before strtod: 20.5
double value: 20.500000
after strtod:

5) strtol()

long int strtol(const char * str, cahr ** endptr, int base)把参数str所指向的字符串根据给定的base转换为一个长整数(类型long int型),base必须介于2和36(包含)之间,或者是特殊值0。

long int strtol(const char *str, char **endptr, int base);
  • str:要转换为长整数的字符串。
  • endptr:对类型为char *的对象的引用,其值由函数设置为str中数值后的下一个字符。
  • base:基数,必须介于2和26(包含),或者是特殊值0。如果base是0,则会根据字符串的前缀来做判断;如果字符串以0x或者0X开头,则将其视为16进制,如果字符串以0开头,则间视其为八进制;否则将使其为十进制。

返回值:返回被转换的长整型整数值。如果输入字符串不符合数字格式,strtol()将返回0。如果转换结果超出了long整数的表示范围,那个将产生溢出,并且设置errno为ERANGE。你可以使用<errno.h>文件头中的errno变量来检查是否有溢出发生。

实例:演示了strtol()函数的用法。

orangepi@orangepi4-lts:~/host_program/host/hostApp$ cat test_strtol.c
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char ** argv)
{
        char str[] = "p-12p2345p578p9";
        char * startptr, * endptr;
        long int num;
        int i, c;


        endptr = str;
        i = 0;
        while (* endptr != '\0'){
                while  (!isdigit(c =* endptr) && c != '-'){
                        endptr++;
                        if (* endptr == '\0'){
                                goto EXIT;
                        }
                }
                        startptr = endptr;
                        num = strtol(startptr, &endptr, 10);
                        printf("%d: %ld\n", ++i, num);
        }

EXIT:
        return 0;
}

编译以上代码并且运行:

orangepi@orangepi4-lts:~/host_program/host/hostApp$ O.linux-aarch64/test_strtol
1: -12
2: 2345
3: 578
4: 9

6)strtoul()

unsigned long int strtoul(const char * str, char ** endptr, int base)把参数str指向的字符串根据给定的base转为一个服务号长整数(类型为unsigned long int 型),base必须介于2和36(包含)之间,或者是特殊的0。

nsigned long int strtoul(const char *str, char **endptr, int base);
  • str:要转换为长整数的字符串。
  • endptr:对类型为char *的对象的引用,其值由函数设置为str中数值后的下一个字符。
  • base:基数,必须介于2和26(包含),或者是特殊值0。如果base是0,则会根据字符串的前缀来做判断;如果字符串以0x或者0X开头,则将其视为16进制,如果字符串以0开头,则间视其为八进制;否则将使其为十进制。

返回值:返回被转换的长整型整数值。如果没有执行有效的转换,则返回一个零值。

实例:展示strtoul()的用法。

orangepi@orangepi4-lts:~/host_program/host/hostApp$ cat test_strtoul.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int main(int argc, char ** argv)
{
        char str[] = "pp12ppppppp2345pp578ppp9p";
        char * startptr, * endptr;
        long int num;
        int i;


        endptr = str;
        i = 0;
        while (* endptr != '\0'){
                while  (!isdigit(* endptr)){
                        endptr++;
                        if (* endptr == '\0'){
                                goto EXIT;
                        }
                }
                        startptr = endptr;
                        num = strtoul(startptr, &endptr, 10);
                        printf("%d: %ld\n", ++i, num);
        }

EXIT:
        return 0;
}

编译并且运行以上代码:

orangepi@orangepi4-lts:~/host_program/host/hostApp$ O.linux-aarch64/test_strtoul
1: 12
2: 2345
3: 578
4: 9
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值