C语言 字符数组转换整数 stringToInt

来源:互联网 发布:网络餐饮监管存在问题 编辑:程序博客网 时间:2024/06/05 20:20

工作了一段时间,一直在公司平台上面码代码,有一天同事分享,突然发现自己连基本的知识都快忘记了


字符串转化z整数数组是考验程序员基本功的经典题目

int stringToInt(const char *str){}

先写一个简单的实现

int stringToInt(const char *str){char *p = str;int nNUM = 0;while (*p != '\0'){nNum = nNUM * 10 + (*p - '0');p++;}return nNUM;}

主要逻辑应该就是这样,每取一位字符,用字符和'0'比较计算数值,累加到前面的数值*10上面

 前面的基础上考虑一下正负数问题

int stringToInt(const char *str){char *p = str;int nNUM = 0;bool bFlage = true;if (*p == '-'){bFlage = false;p++;}else if (*p == '+'){p++;}while (*p != '\0'){nNum = nNUM * 10 + (*p - '0');p++;}if (!bFlage){nNUM = 0 - nNUM;}return nNUM;}

除了+-还有其他非法字符,需要容错处理

int stringToInt(const char *str){char *p = str;int nNUM = 0;bool bFlage = true;if (*p == '-'){bFlage = false;p++;}else if (*p == '+'){p++;}while (*p != '\0'){if ((*P < '0') || (*p > '9')){nNUM = 0;return nNUM;}nNum = nNUM * 10 + (*p - '0');p++;}if (!bFlage){nNUM = 0 - nNUM;}return nNUM;}
上面的代码无法判断0 是成功转换的字符串,还是非法数据之后的返回值,因此定义一个枚举常量,保存每次转换是否成功,可以使用系统枚举值,一般库函数都是自带的,保存对应操作是否成功

enum NumState{OK = 1,ERROR}int stringToInt(const char *str){char *p = str;int nNUM = 0;bool bFlage = true;enum NumState oState = OK;if (*p == '-'){bFlage = false;p++;}else if (*p == '+'){p++;}while (*p != '\0'){if ((*P < '0') || (*p > '9')){nNUM = ERROR;return nNUM;}nNum = nNUM * 10 + (*p - '0');p++;}if (!bFlage){nNUM = 0 - nNUM;}return nNUM;}

在考虑一下,除了上面问题应该还有溢出的问题,增加溢出的判断

int stringToInt(const char *str){char *p = str;int nNUM = 0;bool bFlage = true;enum NumState oState = OK;if (*p == '-'){bFlage = false;p++;}else if (*p == '+'){p++;}while (*p != '\0'){if ((*p < '0') || (*p > '9')){oState = ERROR;nNUM = 0;break;}if ((nNUM * 10)>0 && (*p - '0')&& (2147483647 - (nNUM * 10) < (*p - '0'))){oState = ERROR;nNUM = 0;break;}nNUM = nNUM * 10 + (*p - '0');p++;}if (!bFlage){nNUM = 0 - nNUM;}return nNUM;}


测试一下:

#include <stdio.h>#include <stdbool.h>enum NumState{OK = 1,ERROR};int stringToInt(const char *str){char *p = str;int nNUM = 0;bool bFlage = true;enum NumState oState = OK;if (*p == '-'){bFlage = false;p++;}else if (*p == '+'){p++;}while (*p != '\0'){if ((*p < '0') || (*p > '9')){oState = ERROR;nNUM = 0;break;}if ((nNUM * 10)>0 && (*p - '0')>0&& (2147483647 - (nNUM * 10) < (*p - '0'))){oState = ERROR;nNUM = 0;break;}nNUM = nNUM * 10 + (*p - '0');p++;}if (!bFlage){nNUM = 0 - nNUM;}return nNUM;}int main(){int nNum;nNum = stringToInt("-2147483647");printf("%d\n", nNum);return 0;}

不要忽视容错机制,很重要




0 0
原创粉丝点击