首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >双向atoi()

双向atoi()
EN

Code Review用户
提问于 2014-06-23 17:27:36
回答 1查看 102关注 0票数 5

我是通过从一开始和结束遍历字符串来实现atoi()的。有什么可以改进的吗?

代码语言:javascript
复制
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";
}
EN

回答 1

Code Review用户

发布于 2014-06-23 18:40:24

现在我将集中讨论从左到右的版本。不过,大多数相同的注释也适用于从右到左的版本。

代码语言:javascript
复制
int atoiLefttoRight(char *s){

由于您不打算修改原始字符串,所以参数应该是char const *s

代码语言:javascript
复制
    int num = 0;
    int negative = 1;
    if(s)
        {
        if(*s == '-')

这是an...unusual缩进样式。就我个人而言,我通常更倾向于:

代码语言:javascript
复制
if (s) { 
    if (*s == '-')

其他人则倾向于:

代码语言:javascript
复制
if (s)
{
    if (*s == '-')

考虑到这两种风格占主导地位的程度,我几乎总是在两者之间做出选择,而不是试图发明另一种风格。

代码语言:javascript
复制
            {
            negative = -1;
            s++;

虽然在这种情况下(在极端情况下)不太可能产生影响,但在这种情况下,您可以使用前缀或后缀增量(或减少),我会选择前缀形式,使这个++s;

代码语言:javascript
复制
            }
            while(*s && (*s <= '9') && (*s >= '0'))

您在if语句下缩进,就好像它是由if语句控制的一样(但它不是)。

我也倾向于使用isdigit来确定一个字符是否是数字。

最后,这可能无法正确转换至少一个合法输入。例如,给定一个16位int-32768的输入是合法的、有意义的--但这不能正确地转换它,因为它试图将数字表示为正数(但最大的有符号16位数字是32767)。

对于32位或64位的int,这个数字会变大,但同样的基本思想也适用(如果你有一个更大的int,比如128位,同样的数字仍然是真的--更大的数字,但仍然是一个失败的数字)。

票数 4
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/55048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档