【C】模拟实现atoi,atof函数

文章详细介绍了C语言中的atoi和atof函数,它们分别用于将字符串转换为整数和浮点数。还提供了这两个函数的模拟实现代码,以及测试案例,展示了如何处理字符串中的数字信息以及遇到无效字符时的行为。

目录

atoi函数

atof函数

模拟实现atoi,atof函数

1、atoi模拟实现

2、atof模拟实现

3、测试案例代码


atoi函数

atoi函数是将字符串转换成整数

函数头文件:
#include <stdlib.h>

函数原型:
int atoi(const char *str);

参数:str:要转换为整数的字符串

返回值:该函数返回转换后的长整数,如果没有执行有效的转换,则返回零

1、该函数首先会丢弃尽可能多的空白字符,直到找到第一个非空白字符,然后,从这个字符开始,取一个可选的初识加号或者减号,后跟尽可能多的十进制数字,并将他们返回一个int类型的数值。
2、若该字符串是在整数的字符后包含其他字符,则这些字符将会被忽略,返回其他字符之前的整数,并且不会对该函数造成任何影响。
3、若该字符串中第一个非空字符序列表示有效的整数,或是一个空指针,或只包含空白字符,则不执行任何转换,并且返回零。

测试案例代码如下:

int main(void)
{
	int val = 0;
	char str[20] = { 0 };

	strcpy(str, "20230908");
	val = atoi(str);
	printf("字符串值 = %s, 整型值 = %d\n", str, val);

	strcpy(str, "sakura");
	val = atoi(str);
	printf("字符串值 = %s, 整型值 = %d\n", str, val);

	return(0);
}
<think>嗯,用户想了解C语言atoi函数的使用方法和示例代码。用户要求参考提供的引用内容,并且需要符合特定的格式要求(比如数学公式用$...$,独立公式用$$...$$,中文回答等)。用户之前的查询历史里引用了三个来源:引用[1]说明了atoi和atol函数的头文件声明和功能;引用[2]展示了一个使用命令行参数和atoi的示例;引用[3]则提示了atoi函数和其他类型转换函数的关系。在回答中,我会先说明atoi函数的头文件引入和函数声明,重点突出三点:字符串转整型的特性(忽略空格直到数字)、非数字部分的终止处理以及非数字开头的返回0规则。这些在引用[1]和[3]有提到。然后我会提供三个示例代码:基础转换示例用来演示数字字符串转换;错误处理示例参考引用[3]提到的终止转换特性(比如"42hello"只转42),同时要模拟引用[2]的命令行参数处理结构;实战应用示例可以模拟引用[2]的方式,但更完整地展示命令行参数检查和返回值应用。引用中提到"使用atof()与使用strtod(str,NULL)结果相同"这点对用户有价值,但和问题相关度低,只需在注意事项里简略提一句对比关系即可。回答的结构保持清晰:先说明定义与原型,再解释参数/返回值,重点通过代码演示处理逻辑(如开头空格跳过、符号识别、溢出截断等)。最后添加相关问题扩展时要避免偏离核心需求,比如strtol函数虽重要但可能分散用户注意力,所以放在相关建议里而非单独提问。系统级指令要求行内数学公式格式,这里虽然atoi本身不涉及复杂数学,但在注意事项的"局限性"小节提到整型取值范围时可以用$[-2^{31},2^{31}-1]$表达边界值。此外所有代码块需保留语法高亮但不得出现非代码内容(如示例中的"请提供一个命令行参数"提示文本是合法的)。末尾相关问题要设计成递进式的:错误处理→替代方案→实际应用,这样能自然引导用户深入学习。用户可能是初学者,所以示例代码需要保持简单明确,像命令行参数示例里特意注释了"argc!=2"的判断逻辑。对atoi的最大局限——溢出未定义行为需要重点警告,引用[3]提到的strtol解决方案也应当即给出代码片段。</think> 以下是C语言 `atoi` 函数的详细说明和示例: ### 1. **函数定义与原型** **头文件**:`#include <stdlib.h>` **函数原型**:`int atoi(const char *str);` **功能**:将字符串转换为整型值(`int`),忽略开头空格,直到遇到第一个非数字字符停止。 --- ### 2. **参数与返回值** - **参数**:`str` - 待转换的字符串指针。 - **返回值**: - 成功:转换后的整型值。 - 失败(如非数字开头):返回 `0`。 - 溢出行为:C标准未定义(可能返回 `INT_MAX` 或 `INT_MIN`)。 --- ### 3. **示例代码** #### 示例 1:基础转换 ```c #include <stdio.h> #include <stdlib.h> int main() { char str1[] = "123"; char str2[] = " -456abc"; // 跳过空格,遇到字母停止 char str3[] = "hello"; // 非数字开头 int num1 = atoi(str1); int num2 = atoi(str2); int num3 = atoi(str3); printf("str1 -> %d\n", num1); // 输出: 123 printf("str2 -> %d\n", num2); // 输出: -456 printf("str3 -> %d\n", num3); // 输出: 0 return 0; } ``` #### 示例 2:命令行参数转换 ```c #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { if (argc != 2) { printf("用法:%s <数字>\n", argv[0]); return 1; // 异常退出 } int num = atoi(argv[1]); printf("输入数字的平方:%d\n", num * num); return 0; // 正常退出 } ``` **运行**:`./program 15` → 输出:`输入数字的平方:225` --- ### 4. **注意事项** - **局限性**: - 不检测溢出:建议改用 `strtol` 或 `strtoul` 进行安全转换。 - 无法转换浮点数:需用 `atof` 或 `strtod`。 - **适用场景**:快速转换格式简单的字符串(如配置文件读取)。 --- ### 5. **安全替代方案** 推荐更安全的 `strtol`: ```c #include <stdio.h> #include <stdlib.h> #include <errno.h> int main() { char str[] = "2147483648"; // 超过INT_MAX char *endptr; long num = strtol(str, &endptr, 10); if (str == endptr) { printf("无有效数字\n"); } else if (errno == ERANGE) { printf("数值溢出\n"); } else { printf("转换结果:%ld\n", num); } return 0; } ``` --- ### 相关扩展问题 1. **`atoi` 函数遇到溢出时如何处理?** C标准未定义行为,可能返回 `INT_MAX`/`INT_MIN` 或截断值,需用 `strtol` 检测溢出[^3]。 2. **如何区分 `atoi` 返回 `0` 是转换失败还是实际数字 `0`?** 无法区分,建议检查字符串是否以数字开头或改用 `strtol` 检测错误[^1]。 3. **`atoi` 与 `strtol` 的主要性能差异?** `atoi` 更轻量但无错误处理;`strtol` 更安全但额外检查增加开销[^3]。 4. **命令行参数解析中为何常使用 `atoi`?** 适合快速转换格式已知的参数(如 `./cmd 100`),避免复杂错误处理[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值