我是通过从一开始和结束遍历字符串来实现atoi()的。有什么可以改进的吗?
using namespace std;
int atoiLefttoRight(char *s){
int num = 0;
int negative = 1;
if(s)
{
if(*s == '-')
{
negative = -1;
s++;
}
while(*s && (*s <= '9') && (*s >= '0'))
{
num = (num * 10) + (*s - '0');
s++;
}
}
return (negative * num);
}
int atoiRighttoLeft(char *s){
int i = 1;
int num = 0;
int negative = 1;
if(s){
if(*s == '-')
{
negative = -1;
s++;
}
char *temp = s;
while(*temp)
temp++;
temp--;
while(*temp && temp >= s)
{
if( *temp <= '9' && *temp >= '0'){
num = num + ( (*temp - '0') * i);
i = i*10;
temp--;
}
else
{
temp--;
num = 0;
i = 1;
}
}
}
return (negative * num);
}
int main()
{
cout<<atoiLefttoRight("-12ab3")<<"\n";
cout<<atoiRighttoLeft("1234h5")<<"\n";
}发布于 2014-06-23 18:40:24
现在我将集中讨论从左到右的版本。不过,大多数相同的注释也适用于从右到左的版本。
int atoiLefttoRight(char *s){由于您不打算修改原始字符串,所以参数应该是char const *s。
int num = 0;
int negative = 1;
if(s)
{
if(*s == '-')这是an...unusual缩进样式。就我个人而言,我通常更倾向于:
if (s) {
if (*s == '-')其他人则倾向于:
if (s)
{
if (*s == '-')考虑到这两种风格占主导地位的程度,我几乎总是在两者之间做出选择,而不是试图发明另一种风格。
{
negative = -1;
s++;虽然在这种情况下(在极端情况下)不太可能产生影响,但在这种情况下,您可以使用前缀或后缀增量(或减少),我会选择前缀形式,使这个++s;
}
while(*s && (*s <= '9') && (*s >= '0'))您在if语句下缩进,就好像它是由if语句控制的一样(但它不是)。
我也倾向于使用isdigit来确定一个字符是否是数字。
最后,这可能无法正确转换至少一个合法输入。例如,给定一个16位int,-32768的输入是合法的、有意义的--但这不能正确地转换它,因为它试图将数字表示为正数(但最大的有符号16位数字是32767)。
对于32位或64位的int,这个数字会变大,但同样的基本思想也适用(如果你有一个更大的int,比如128位,同样的数字仍然是真的--更大的数字,但仍然是一个失败的数字)。
https://codereview.stackexchange.com/questions/55048
复制相似问题