在我们学习c语言或者c++时,总会遇到一些我们熟悉的库函数,这时候就需要我们通过cplusplus网站搜索学习,下面就由我为大家演示一下如何通过这个网站的页面学习函数的使用方法吧!
atoi - C++ Reference (cplusplus.com)
我们今天要学习的是atoi库函数。
首先我们来看这个函数的参数和返回类型
函数的返回类型为int,函数接收的参数类型为const char* 类型。
接着看下面这一大段文字:
我们通过翻译,我们可以了解到,atoi 是一个标准的库函数,它的全称是 "ASCII to Integer",用于将 ASCII 字符串转换成整数。
这个函数会解析 ptr 指向的字符串,直到遇到无法转换为数字的字符为止,然后将解析得到的数字返回。如果 ptr 无法被解析为有效的整数(例如,它是一个空字符串,或者它不包含任何数字),则函数返回 0。
再看看它的参数和返回值:
C-string 以整数的表示形式开头。
成功后,该函数将转换后的整数作为值返回。
如果转换后的值超出 的可表示值范围,则会导致未定义的行为。
#include <stdio.h> #include <stdlib.h> int main() { const char *str = "12345"; int num = atoi(str); printf("The number is: %d\n", num); return 0; }
在这个例子中,字符串 "12345" 被转换为整数 12345,然后打印出来。
然后,我们可以通过一些案例,具体研究一下这个函数的用法:
通过输入1234字符串,我们发现输出结果转换成了数字:
在这个例子中,字符串 "12345" 被转换为整数 12345,然后打印出来。
然后,我们可以通过一些案例,具体研究一下这个函数的用法:
通过输入1234字符串,我们发现输出结果转换成了数字:
接着我们在前面添上正负号试试:
我们会发现这个函数会读取字符串前面的正负号。
那如果字符串前面有空格呢?
正如你所见,这个函数会把空格过滤掉。
那如果添加上一些字母呢,还会不会被转换呢?
并不会把字母打印出来。
那如果是在中间加上空格呢?
这时后面的数字都消失了。
我们输入一个很大或者很小的数字时:
会把这个很大或很小的数值转换为最大或最小的数字。
在传递空值时:
接下来,我们来模拟实现一个 atoi
函数。这个函数需要处理一些边界情况,比如空指针、空字符串、跳过前导空格、正负号等。此外,我们还需要处理可能的溢出情况。
对于跳过前导空格,我们需要下面这样一个库函数:
isdigit用来判断传入的是不是数字字符
下面我们来模拟实现以下这个函数:
# define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<assert.h> #include<ctype.h> enum State { VAILD, INVAILD }state = INVAILD; int MyAtoi(const char* str) { assert(str != NULL); if (*str == '\0') { return 0; } while (isspace(*str))//isspace返回值不为0,代表是空格 { str++; } //代码走到这里之后,str遇到的一定不是空格,有可能是正负号 int flag = 1; if (*str == '+') { flag = 1; str++; } else if (*str == '-') { flag = -1; str++; } long long ret = 0; while (*str != '\0') { if (isdigit(*str)) { //是数字字符 把字符1变成数字1->把字符'1'减去'0'得到的就是数字1 ret = ret * 10 + (*str - '0') * flag; } else { //不是数字字符 return (int)ret; } str++;//让指针继续往后走 } //解决最大最小值问题 if (ret > INT_MAX) { ret = INT_MAX; } if (ret < INT_MIN) { ret = INT_MIN; } //正常转换和非正常转换的区别在于一个走到斜杠0,一个没有 if (*str == '\0') { state = VAILD; } return (int)ret; } int main() { int ret = MyAtoi("123 "); if (state == VAILD) { printf("合法转换:%d\n", ret); } else { printf("不合法转换:%d", ret); } return 0; }