Unix/Linux环境C编程入门教程(23) 字符数字那些事儿

1.atoi

包含头文件:

#include <stdlib.h>

函数原型:

int atoi( const char *str );

功能:将字符串str转换成一个整数并返回结果。参数str 以数字开头,当函数从str 中读到非数字字符则结束转换。

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

示例代码:

i = atoi( "512.035" );

i 的值为 512.

2.atol函数

包含头文件:

#include <stdlib.h>

函数原型:

long atol( const char *str );

函数功能:将字符串转换成长整型数并返回结果。函数会扫描参数str字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时才结束转换,并将结果返回。

返回值:返回转换后的长整型数。如果传入的字符串为空,或者字符串包含的内容非阿拉伯数字序列,则函数返回默认值0

示例代码:

x = atol( "1024.0001" );

x的值为1024L.

3.atof函数

所需要的头文件:

#include <stdlib.h>

函数原型:

double atof( const char *str );

函数功能:

将字符串str转换成一个双精度数值并返回结果。 参数str 必须以有效数字开头,但是允许以"E"或"e"除外的任意非数字字符结尾。

返回值:

返回转换后的浮点型数

示例代码:

x = atof( "42.0is_the_answer" );

x的值为42.0.

通过这个3个函数我们是不是发现了什么呢?

Unix/Linux环境C编程入门教程(23)  字符数字那些事儿

ato* 型

如果是i 代表int也就是从ascii码值转化成一个int的值,

同理 l 代表转换成一个long型的值,

f代表转换成一个float型的值。

4.Linux中查找这些函数

我们进入到Linux桌面

Unix/Linux环境C编程入门教程(23)  字符数字那些事儿

点击在终端中打开

Unix/Linux环境C编程入门教程(23)  字符数字那些事儿

在终端中输入 man atoi

Unix/Linux环境C编程入门教程(23)  字符数字那些事儿

如下显示的是man中关于atoi atol的介绍

同理我们可以使用man查看atof的介绍 在终端中键入:man atof

Unix/Linux环境C编程入门教程(23)  字符数字那些事儿

退出man帮助文档的界面

Unix/Linux环境C编程入门教程(23)  字符数字那些事儿

5.小试牛刀

下面我们使用这3个函数写几行有意思的代码加深理解。

#include <stdio.h> //printf scanf
#include <stdlib.h> //atoi atol atof int main(void)
{
char input[32]="4294967299";
int iNum = atoi(input);
float fNum = atof(input);
long lNum = atol(input);
printf("int = %d\nfloat = %f\nlong = %ld\n",iNum,fNum,lNum);
return 0;
}

在RHEL7中打开终端 利用vi创建一个main.c或者在windows上传送进虚拟机

Unix/Linux环境C编程入门教程(23)  字符数字那些事儿

回车进入

Unix/Linux环境C编程入门教程(23)  字符数字那些事儿

同时按下:键和shift键 进入末行模式 然后输入wq

Unix/Linux环境C编程入门教程(23)  字符数字那些事儿

保存并退出之后会到终端的界面

Unix/Linux环境C编程入门教程(23)  字符数字那些事儿

下面开始编译 ./itcast运行可执行文件 结果显示出来了

Unix/Linux环境C编程入门教程(23)  字符数字那些事儿

慢着 怎么int的值输出3了呢?

思考一下 我们输入的字符4294967296这个数值是太大了

6.数据类型与范围

  1. 超过int的范围 所以一旦数值超过了该数据类型所能表示的范围就会发生溢出

数据模型决定了C语言中基本数据类型与数据宽度的对应关系。我们常用的32位模型称为ILP32,而64位模型有三种:LP64、LLP64和ILP64。在64位模型中,指针一定是64位的,但是int和long的宽度则在不同的数据类型中有不同的定义。

现在的Windows 32和Linux 32是ILP32;Windows x64 版采用的是LLP64模型,Linux64采用的是LP64模型,用gcc编译时可以指定-m32按照ILP32模型进行编译。

数据类型\模型

LP32

ILP32

LLP64

LP64

ILP64

char

8

8

8

8

8

short

16

16

16

16

16

int

16

32

32

32

64

long

32

32

32

64

64

long long

64

64

64

64

64

pointer

32

32

64

64

64

总结:使用一个数据类型的时候我们应该清晰的知道该数据类型的范围能否完全表示这个变量

7.其他环境中效果怎么样呢?

在Solaris x64上

Unix/Linux环境C编程入门教程(23)  字符数字那些事儿

Unix/Linux环境C编程入门教程(23)  字符数字那些事儿

Unix/Linux环境C编程入门教程(23)  字符数字那些事儿

在RHEL6 32bit上

Unix/Linux环境C编程入门教程(23)  字符数字那些事儿

Unix/Linux环境C编程入门教程(23)  字符数字那些事儿

Unix/Linux环境C编程入门教程(23)  字符数字那些事儿

在MAC x64上

Unix/Linux环境C编程入门教程(23)  字符数字那些事儿

Unix/Linux环境C编程入门教程(23)  字符数字那些事儿

Unix/Linux环境C编程入门教程(23)  字符数字那些事儿

通过上述实验我们可发现,不同的操作系统可能对于数据类型的采用也是不一样的。

这对于我们以后要写一个跨多个操作系统的程序提出了警示。

有兴趣的同学可以去研究一下,对应着本文给出的数据类型和模型的对应图去推测各个操作系统的选用数据类型的版本。

上一篇:Nmap命令


下一篇:Unix/Linux环境C编程入门教程(29) 内存操作那些事儿