第20题:
题目:输入一个表示整数的字符串,把该字符串转换成整数并输出。
例如输入字符串”345”,则输出整数345。
题目分析:
题目分析,此题看起来简单,类似于C语言库函数atoi()但是其实一点也不简单;
我们分析一下需要都考虑哪些元素:
1.输入字符串中出现符号‘+’ | ‘-’,出现符号‘+’不处理,出现符合‘-’将输出整数转为负数;
2.字符串中出现非法字符,若字符串中出现非法字符,则返回错误;
3.字符串结束,以‘\0’视作输入字符串结束,若第一个出现的字符就是‘\0’,那么返回错误;
4.字符串超长问题,若输入字符串转换为整数过程中超过long long那么返回错误;
5.将字符串转换为整数的方法,一个字符一个字符读取,每次做*10操作;
6.字符串以0开头,后边跟其它数字的情况。
代码:
typedef struct _Error {
int errorNo;
std::string errorInfo;
}Error;
int Atoi(char * str, Error &error) {
char *tmp = str;
long long value = 0;
bool isNegative = false;
error.errorNo = 0;
/* 处理输入字符串为空的情况 */
if (NULL == str) {
error.errorNo = -1;
error.errorInfo = "The input string is empty!";
return -1;
}
/* 处理输入第一个字符为'\0'的情况 */
if ('\0' == *tmp) {
error.errorNo = -2;
error.errorInfo = "The input string is illegal!";
return -1;
}
/* 处理输入字符串是负数的情况 */
if ('-' == *tmp) {
isNegative = true;
tmp++;
}
/* 处理输入字符串中出现'+'的情况 */
if ('+' == *tmp) {
tmp++;
if ('\0' == *tmp) {
error.errorNo = -1;
error.errorInfo = "The input string is illegal!";
return -1;
}
}
/* 处理以0开头,后边根其它数字的情况 */
if ('0' == *tmp && '\0' != str[2]) {
error.errorNo = -2;
error.errorInfo = "The input string is illegal!";
return -1;
}
while ('\0' != *tmp) {
if ('9' < *tmp || '0' > *tmp) {
error.errorNo = -3;
error.errorInfo = "The input string is illegal!";
return -1;
} else {
value = value * 10 + (*tmp - '0');
/* 处理超过整数长度的情况 */
if (value > std::numeric_limits<int>::max()) {
error.errorNo = -4;
error.errorInfo = "The number Overflow!";
return -1;
}
}
tmp++;
}
return (isNegative) ? (int)(0 - value) : (int) value;
}
对上面的代码做单元测试,测试程序如下:
int test_20() {
Error error;
printf("Test case 1 : input 123456, output %d\n",Atoi((char*)"123456", error));
printf("Test case 2 : input -123456, output %d\n",Atoi((char*)"-123456", error));
printf("Test case 3 : input abcd, output %d\n",Atoi((char*)"abcd", error));
printf("Test case 4 : input +12345, output %d\n",Atoi((char*)"+12345", error));
printf("Test case 5 : input '', output %d\n",Atoi((char*)"", error));
printf("Test case 6 : input NULL, output %d\n",Atoi(NULL, error));
printf("Test case 7 : input 123456789123455, output %d\n",Atoi((char*)"123456789012345", error));
if (error.errorNo != 0) {
cout<<"error no = "<<error.errorNo<<endl;
cout<<"error info = "<<error.errorInfo<<endl;
}
return 0;
}
#include "20th.h"
int main(int argc, const char * argv[]) {
// test_1();
// test_2();
// test_3();
// test_4();
// maxHeap_test();
// test_5_1();
// test_7();
// test_9();
// test_10();
// test_11();
// test_13();
// test_14();
// test_15();
// test_17();
test_20();
return 0;
}
测试结果:
Test case 1 : input 123456, output 123456
Test case 2 : input -123456, output -123456
Test case 3 : input abcd, output -1
Test case 4 : input +12345, output 12345
Test case 5 : input '', output -1
Test case 6 : input NULL, output -1
Test case 7 : input 123456789123455, output -1
error no = -4
error info = The number Overflow!
Program ended with exit code: 0
Okay,前二十题总算解完了,这个系列完成20%了,更新的有点慢了最近。下面开始第21题到100题。