函数atoi的C语言实现

文章目录
  1. 函数介绍
    1. 功能
    2. 原型
    3. 参数
  2. 代码实现
  3. 测试
    1. 调用
    2. 运行结果
    3. 运行环境

C语言经典函数的实现之atoi函数。

函数介绍

功能

将一个字符串转换为整型数据返回。忽略字符串开头的空格,遇到其他字符直接返回0,遇到第一个「+」、「-」或0-9的数字开始转换,直到遇到非数字字符结束转换。

原型

1
int atoi(const char *nptr);

参数

  • const char *nptr 源字符串首地址。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
int atoi(const char *nptr) {
if (nptr == NULL) {
return 0;
}
char *src = (char *)nptr;
char temp; // 临时保存每一字符
int result = 0; // 返回结果
int minus = 1; // 符号位
bool isConverting = false; // 当开始转换标记为true
while (temp = *src++) {
if (isConverting) {
// 已经开始转换中
if (temp >= '0' && temp <= '9') {
// 转换中间的数字
result = result * 10 + temp - '0';
} else {
// 转换停止
break;
}
} else if (temp == '+' || temp == '-' || (temp >= '0' && temp <= '9')) {
// 加号减号和数字为开始转换的起点
isConverting = true;
if (temp == '-') minus = -minus;
// 设置符号位
if (temp >= '0' && temp <= '9') {
// 首位数字的转化
result = temp - '0';
}
} else if (temp == ' ') {
// 开头为空格,跳过
continue;
} else {
// 遇到其他字符,转化失败,直接返回0
return 0;
}
}
// 结果乘符号位
result *= minus;
return result;
}

测试

调用

1
2
3
4
5
6
int main() {
char *string;
scanf("%s", string);
printf("%d", atoi(string));
return 0;
}

运行结果

  • 测试0

    输入:12a3456

    输出:12

  • 测试1

    输入: -12345q6

    输出:-12345

  • 测试2

    输入:a123456

    输出:0

  • 测试3

    输入: 123 456

    输出:123

运行环境

Mac OS X 10.10.5

CLion 1.0

CMake 3.1.3