atoi
是 C 语言标准库函数,用于将字符串转换为整数。这个函数原型定义在 <stdlib.h>
头文件中。
http://atoi - C++ Reference (cplusplus.com)
atoi
的名称代表 "ASCII to Integer",即从 ASCII 字符串转换到整数。它是处理字符串和数字之间转换的常用函数之一。
函数原型
int atoi(const char *str);
参数
str
:指向要转换为整数的以 null 结尾的字符数组(字符串)的指针
返回值
- 返回
str
指向的字符串表示的整数值。如果str
不能转换为整数或者字符串为空,那么返回结果是未定义的。标准并没有明确指出错误情况下的返回值,因此,如果输入的字符串不是一个有效的表示整数的字符串,程序的行为可能会依赖于具体的实现。
使用注意
atoi
函数在转换过程中会跳过前导空白字符(例如空格),直到遇到第一个非空白字符。- 从第一个非空白字符开始,函数会取尽可能多的数字字符来进行转换,直到遇到第一个非数字字符。
- 如果字符串的第一个非空白字符不是有效的整数或者字符串为空,转换的结果是未定义的。在这种情况下,使用
strtol
或strtoll
函数可能是更好的选择,因为这些函数提供了错误处理的功能。 atoi
函数不设置errno
来报告转换错误。
示例代码
#include <stdio.h>
#include <stdlib.h>
int main() {
char str1[] = "123";
char str2[] = " 456"; // 前面有空格
char str3[] = "abc"; // 非数字开头的字符串
int num1 = atoi(str1);
int num2 = atoi(str2);
int num3 = atoi(str3); // 结果未定义,通常返回0
printf("%d\n", num1); // 输出: 123
printf("%d\n", num2); // 输出: 456
printf("%d\n", num3); // 输出: 0 或未定义
return 0;
}
在使用 atoi
函数时,应当确保输入字符串是有效的整数表示,否则考虑使用提供错误检查的 strtol
或 strtoll
等函数。
模拟实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
//模拟实现atoi函数
int my_atoi(const char* str)
{
int count = 0;
int sign = 1;//默认假设正数
//1.跳过前导空白字符
while (*str == ' ' || *str == '\t' || *str == '\n')
{
str++;
}
//2.检查正负号
if (*str == '-' || *str == '+')
{
sign = (*str == '-') ? -1 : 1;
//如果“条件”为真(即非零),则整个表达式的结果是“表达式1”的结果;如果“条件”为假(即零),
//则结果是“表达式2”的结果。
}
//3.转换数字,直到非数组字符
while (*str >= '0' && *str <= '9')
{
int digit = *str - '0';
count = count * 10 + digit;
//这行代码是数字字符串转换为整数的核心逻辑。它的作用是将之前已经转换的数字乘以10(因为我们
//正在处理一个新的数字位,并且数字是以10为基数的),然后加上当前字符代表的数字。
str++;
}
return count * sign;
}
int main()
{
char str1[] = "123";
char str2[] = " 456";
char str3[] = "abc";
int num1 = my_atoi(str1);
int num2 = my_atoi(str2);
int num3 = my_atoi(str3);
printf("%d\n", num1);
printf("%d\n", num2);
printf("%d\n", num3);
return 0;
}
尽管 atoi
是一个相对简单直接的工具,用于将字符串转换为整数,但正确地理解和使用它却需要注意一些细节。从处理前导空格到识别正负号,再到理解其在遇到非数字字符时的行为,atoi
函数背后有着不少值得我们深入挖掘的知识。
通过本篇博客,希望你不仅能够更加熟悉 atoi
函数及其使用,还能够更加深刻地理解在使用这类函数时需要考虑的各种因素。
Happy coding!
以上就是本篇全部内容。
如有不足之处恳请各位多多指出。
我是高耳机。