精利手表网站,装修公司排名,用媒体做响应式网站可以吗,大连网站建设学校atoi()详解及其模拟实现
atoi()解析
所需头文件为stdlib.h
int atoi (const char * str);整体功能#xff1a; 分析字符串 str#xff0c;将其内容解释为整数#xff0c;该整数作为 int 类型的值返回。 细节#xff1a; 该函数首先根据需要丢弃尽可能多的空格字…atoi()详解及其模拟实现
atoi()解析
所需头文件为stdlib.h
int atoi (const char * str);整体功能 分析字符串 str将其内容解释为整数该整数作为 int 类型的值返回。 细节 该函数首先根据需要丢弃尽可能多的空格字符如在 isspace 中直到找到第一个非空格字符。 然后从此字符开始取一个可选的首字母加号或减号后跟尽可能多的 10 进制数字并将它们解释为数值。 字符串可以在构成整数的字符之后包含其他字符这些字符将被忽略并且对此函数的行为没有影响。 如果 str 中的第一个非空格字符序列不是有效的整数或者由于 str 为空或仅包含空格字符而不存在此类序列则不执行转换并返回零。 如果被解释成的数字大于INT_MAX或者小于MIN_MAX那么就返回0 例如
#includestdio.h
#includestdlib.h
int main()
{printf(%d\n, atoi( ));printf(%d\n, atoi(0));printf(%d\n, atoi(1234));printf(%d\n, atoi(1234aabcd));printf(%d\n, atoi( 1234 1234));printf(%d\n, atoi(01234));printf(%d\n, atoi(-01234));printf(%d\n, atoi(a1234));printf(%d\n, atoi(a12341111111111111111111111111111111111111111111111111111111));return 0;
}output:
0
0
1234
1234
1234
1234
-1234
0
0缺陷
我们看到当转换失败时函数atoi()的返回值是0正确将字符0转换为数字0函数atoi()的返回值也是0因此当函数返回0时我们就不能区分到底是这个字符串是非法字符串还是本身转换过来就是0这点需要在模拟实现中进行改进。
模拟实现my_atoi()
为了避免上面提到的缺陷我们可以定义一个全局变量state用来对函数返回值合法性判断
enum State
{VALID, //0合法INVALID //1非法
};
enum State state INVALID; //首先默认非法如果合法再进行修改确保传入的指针不是空指针
assert(str);排除空格
while (*str )str;如果排除完空格之后指针str就走到尾了就说明这是一个空白字符串直接返回0
if (*str \0)return 0;为了方便对正负数进行判断我们设立一个标记flag
int flag 1;
if (*str -)
{flag -1;str;
}
if (*str )
{str;
}因为转换数字的时候可能超出int型的范围因此我们要将返回值定义为long long类型方便后续进行有效性判断返回值必须在int型的范围内
long long ret 0;while (isdigit(*str)) //isdigit()用来判断一个字符是否是数字字符
{ret ret * 10 flag * (*str - 0);if (ret INT_MAX || ret INT_MIN) //如果结果大于int最大值小于int最小值那么直接返回0return 0;str;
}最后得到返回值ret再对其后面的字符进行判断如果是结束符‘\0’说明返回值合法否则还是一个非法值
if (*str \0)
{state VALID; //如果合法就将state修改为VALID说明返回值合法return (int)ret;
}
elsereturn (int)ret;实现代码
#includeassert.h
#includestdlib.h
#includestdio.h
#includelimits.h
enum State
{VALID,//0INVALID//1
};
enum State state INVALID;
int my_atoi(const char* str)
{assert(str);while (*str )str;if (*str \0)return 0;int flag 1;if (*str -){flag -1;str;}if (*str ){str;}long long ret 0;while (isdigit(*str)){ret ret * 10 flag * (*str - 0);if (ret INT_MAX || ret INT_MIN)return 0;str;}if (*str \0){state VALID;return (int)ret;}elsereturn (int)ret;
}