【C语言】atoi:隐藏的数值转换宝藏函数

atoi 是 C 语言标准库函数,用于将字符串转换为整数。这个函数原型定义在 <stdlib.h> 头文件中。

http://atoi - C++ Reference (cplusplus.com)

atoi 的名称代表 "ASCII to Integer",即从 ASCII 字符串转换到整数。它是处理字符串和数字之间转换的常用函数之一。

函数原型

int atoi(const char *str);

参数 

  • str:指向要转换为整数的以 null 结尾的字符数组(字符串)的指针

返回值 

  • 返回 str 指向的字符串表示的整数值。如果 str 不能转换为整数或者字符串为空,那么返回结果是未定义的。标准并没有明确指出错误情况下的返回值,因此,如果输入的字符串不是一个有效的表示整数的字符串,程序的行为可能会依赖于具体的实现。

使用注意 

  1. atoi 函数在转换过程中会跳过前导空白字符(例如空格),直到遇到第一个非空白字符。
  2. 从第一个非空白字符开始,函数会取尽可能多的数字字符来进行转换,直到遇到第一个非数字字符。
  3. 如果字符串的第一个非空白字符不是有效的整数或者字符串为空,转换的结果是未定义的。在这种情况下,使用 strtol 或 strtoll 函数可能是更好的选择,因为这些函数提供了错误处理的功能。
  4. 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 函数时,应当确保输入字符串是有效的整数表示,否则考虑使用提供错误检查的 strtolstrtoll 等函数。

模拟实现

#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!


以上就是本篇全部内容。

如有不足之处恳请各位多多指出。

我是高耳机。 

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值