你会写“atoi”吗???

分析:

1、如果输入的字符包含不是数字字符的字符???

例如:“123adc4".

针对这种情况,我们只要加上判断就行了,只要遇到不是数字字符的直接返回。

2、如果在数字字符前面有正负号又该怎么办???

例如:”-123”、“+123”.

针对这种情况,我们再加上判断,判断字符串的第一个字符是不是正负号,并用一个标记位flag记录正负。

3、当输入的字符串前面几个字符都是空格又该怎么办???

例:“   -123”,“   +123”.

针对这种情况,库里面的atoi是将空格跳过再进行判断的,所以我们在一开始就用循环将空格跳过,注意这时候要是字符串里面全部是空格,则我们应该返回一个值,就返回0吧。

4、当输入的字符串中没有数字时,我们应该返回什么呢???

我们在这种情况下返回0.

5、当字符串中的字符数字转化的整数太大,会有可能溢出???

针对这种情况,我们需要做出一个判断,判断转化后的数字当它的范围在long的范围内。

那么最重要的一个问题来了,当你第3、4中情况下,返回的是0,如果输入“0”返回的也是0,这两个0怎么区分呢???,貌似在这里你把3、4两种情况下的返回值设置成什么都不合适。所以我们可以设置一个全局变量state,来记录是不是正常返回。

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>

enum State
{
	NORMAL,                        //正常
	ABNORMAL                       //异常
}state;
state = ABNORMAL;                    //将初始状态置为异常
int my_atoi(const  char *src)
{
	assert(src);
	int flag = 1;
	long long ret = 0;
	while (*src==' ')                           //跳过空格
	{
		src++;
	}
	if (*src == '\0')                           //如果这时候字符串已经完了,则直接返回
	{
		return  0;
	}
	if (*src == '+')                            //接下来判断正负
	{
		src++;
	}
	else if (*src == '-')
	{
		flag = -1;
		src++;
	}
	while (*src >= '0'&&*src <= '9')             //读取字符数字转换成整型
	{
		ret = ret * 10 + flag*(*src-'0');
		if (ret >= INT_MAX|| ret <= INT_MIN)          //如果溢出的话直接跳出
		{
			break;
		}
		src++;
	}
	if (*src == '\0')                         //正常返回
		state = NORMAL;                       //将状态置为正常
	return (int)ret;
}
int main()
{
	char arr[50] = { 0 };
	scanf("%s", arr);
	int ret=my_atoi(arr);
	if (state == ABNORMAL)
		printf("异常返回\n");
	printf("%d\n", ret);
	system("pause");
	return 0;
}
时间: 2024-10-23 20:41:51

你会写“atoi”吗???的相关文章

atoi函数的详细实现(考虑溢出)

atoi()函数的功能:将字符串转换成整型数.atoi()会扫描参数str字符串,跳过前面的空白字符,直到遇上数字或正负号才开始做转换,而再遇到非数字或字符串时('\0')才结束转化,并将结果返回(返回转换后的整型数). 写atoi函数的时候需要注意一下几点 1. 忽略字符串前的空白字符 2. 字符串所表示数值的正负号 3. 结束条件,遇到非数字或者字符'\0'结束 4. 考虑溢出,分别与int值所能表示的最大(0x7fffffff)和最小值(0x8000000)进行比较 5. 考虑异常输入情况

2017校招运维岗总结(腾讯+百度+京东+华为+中兴+小米+58+平安科技+搜狐+航天三院+Others)

先总结一下面试过的公司吧,可以为后人选择公司作为参考 前面是我对各公司的评价,不想看的可以直接拉到后面   最寒心的: 腾讯 内推的时候问六级过了吗,没过能毕业吗? 然后聊了10分钟项目就挂了 : )    校招的时候,笔试完了状态直接变成了面试未通过 最糟心的: 百度 内推死于二面,技不如人,甘拜下风    校招死于三面,据说百度今年在哈尔滨只招了15人,而且我也有点作死,投的岗位全国招15个  死于三面不甘心啊 最闹心的: 京东 京东直接校招,然后9月8号发短信让9月10号去北京面试,9月9

cs硕士妹子找工作经历【阿里人搜等互联网】

摘自  北邮人论坛  分享他人成功的求职经历.原文如下: 唉,妹子本来是本着写面经的态度与大家分享,之自己情况也是想说明一啥都不会的菜鸟在悲催的逆境下也可以凭自身努力找到offer,没想到被评为作秀...妹子能力背景确实和说的一样,但是从9月开始不是天天熬夜看了一个多月的书吗?菜鸟也可以拼命锻炼翅膀的... 妹子还是把背景舍去,只写面经吧   妹子是cs土著一枚,折腾了半年找工作,现在貌似也是尘埃落定了,手里还有2个offer待定,还在纠结中. 妹子开始找工作时间挺晚,是9月7号左右,之前完全没

第十天:shell编程基础与编写Makefile

一:shell编程基础 shell定义:shell是一个作为用户与linux系统间接口的程序.它允许用户向操作系统输入需要执行的命令.shell有很多中,linux系统中shell为bash. shell编程可以看作是一堆命令的集合.和windows中的bat程序类似的脚本程序.为解释性语言. 第一个shell程序是判断两个数字的大小. 1 #!/bin/bash 2 3 num1=10 4 num2=9 5 6 if test $num1 -gt $num2 7 then 8 echo $nu

leetCode做题笔记二(4, 8)

LeetCode8, 手写atoi,一大堆判断...最好记录408ms,约为5%. 经验4:如何经济的判断溢出   经验5:让不合法的输入第一时间return0;   经验6:对于javascript里那一堆isxxx的函数,对应在Java的Character类下 2. LeetCode4 求两个升序数组的中位数 网上大部分解法都是错误的,和我犯了一样的错误.三个小时啊啊啊啊啊白费了 经验7:求平均数应该除以2.0 错误算法: 分别求出序列A 和B 的中位数,设为a 和b,求序列A 和B 的中位

【C语言】模拟实现atoi函数

atoi(表示 ascii to integer)是把字符串转换成整型数的一个函数. atoi()函数会扫描参数 nptr字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过isspace( )函数来检测),直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回.如果 nptr不能转换成 int 或者 nptr为空字符串,那么将返回0 我们在模拟实现atoi函数时,要注意以下几点: 1.字符串之前的空白问题 2.正负号 3.字符串为空时 4.

Hdu 1106 排序 (atoi函数与 strtok函数的应用

链接: http://acm.hdu.edu.cn/showproblem.php?pid=1106 好久都没刷题了,今天突然特别怀念以前刷题的日子,所以就找了几道水题来做做~~呵呵 在写这篇博客之前呢,已经很明了自己已经大三了,时光匆忙,在还没来得及转过头来,就已经过了两年了大学,原来走了这么远了~~感觉再怎么样,大三还是不敢偷懒~~不过有时候还真是挺迷茫的说实话,在这里呢,真心希望能得到你们各位的建议,只要是对我未来就业有好处的,我都会虚心取纳,(BTW:我是学嵌入式方向的)万分感谢~~~

关于atoi,itoa与itob的重写和字符统计

首先关于函数atoi的重写, atoi的功能是字符串能够转换为整数保存,仅仅针对于整数,浮点数以后会有写: //实现一个函数int my_atoi(char s[]),可以将一个字符串转换为对应的整数. #include <stdio.h> #include <ctype.h> int main() { char st[50]; gets(st);  printf("%d",atoi(st)); return 0; } int atoi(char s[]) {

[写代码]解析自定义数据库文件的思路

从文件中getilne一整条数据,里面有各种信息,首先要分析数据的构成,然后看清楚数据的分隔符.再找找小规律就可以写出来了.这里举个小例子: 比如你要解析这样的数据: 1 0 2015 12 25 20 00 ^圣诞节^ 3 2 0 2014 06 08 22 11 ^I dont know.^ 3 可以这么写: 1 #include <iostream> 2 #include <fstream> 3 #include <cstdlib> 4 #include <