题目要求:输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串"345",则输出整数345。
分析:这道题能够很好地反应出程序员的思维和编程习惯。
的确,自己编写的程序代码如下:
#include "stdafx.h"
#include<iostream> void String2Num(const char* str);
using namespace std;
int main(int argc, char* argv[])
{
const char* str = "2343121";
String2Num(str);
return 0;
} void String2Num(const char* str)
{
long value = 0;
while(*str != '\0')
{
value = value*10 + (*str - '0');
str++;
}
cout<<value<<endl;
}
很多地方都没有考虑到,优秀程序员应该考虑到以下几方面:
1、主体:
value = value*10 + (*str - '0');
2、因为用到指针,所以判空
if(str != NULL)
3、数据溢出
4、对输入非法数据的处理
所以标准答案很不错,Nice!如下:
enum Status {kValid = 0, kInvalid};
int g_nStatus = kValid; ///////////////////////////////////////////////////////////////////////
// Convert a string into an integer
///////////////////////////////////////////////////////////////////////
int StrToInt(const char* str)
{
g_nStatus = kInvalid;
long long num = 0; if(str != NULL)
{
const char* digit = str; // the first char in the string maybe '+' or '-'
bool minus = false;
if(*digit == '+')
digit ++;
else if(*digit == '-')
{
digit ++;
minus = true;
} // the remaining chars in the string
while(*digit != '\0')
{
if(*digit >= '0' && *digit <= '9')
{
num = num * 10 + (*digit - '0'); // overflow
if(num > std::numeric_limits<int>::max())
{
num = 0;
break;
} digit ++;
}
// if the char is not a digit, invalid input
else
{
num = 0;
break;
}
} if(*digit == '\0')
{
g_nStatus = kValid;
if(minus)
num = 0 - num;
}
} return static_cast<int>(num);
}
另外的解释:
讨论:在参考代码中,我选用的是第一种声明方式。不过在面试时,我们可以选用任意一种声明方式进行实现。但当面试官问我们选择的理由时,我们要对两者的优缺点进行评价。第一种声明方式对用户而言非常直观,但使用了全局变量,不够优雅;而第二种思路是用返回值来表明输入是否合法,在很多API中都用这种方法,但该方法声明的函数使用起来不够直观。
最后值得一提的是,在C语言提供的库函数中,函数atoi能够把字符串转换整数。它的声明是int atoi(const char*str)。该函数就是用一个全局变量来标志输入是否合法的。