C语言 将字符串递归转换为整数?

xqkwcwgp  于 2023-05-16  发布在  其他
关注(0)|答案(5)|浏览(171)

下面是一个简单的函数,它将字符串转换为整数。

int str2int(char *str)
{
    int ret = 0;
    char *c;

    for (c = str; (*c != '\0') && isdigit(*c); ++c)
        ret = ret*10 + *c - '0';

    return ret;
}

作为练习,我想写一个递归函数来做同样的事情。这是我的想法

int str2int2(char *c, int *i)
{
    if (*c == '\0' || !isdigit(*c))
        return *i;

    *i = *i * 10 + *c - '0';

    return str2int2(c + 1, i);
}

.
.
int i = 0;
.
... str2int2(str, &i);

有没有一种方法可以在不使用额外的int*参数的情况下编写递归函数?

bbmckpt7

bbmckpt71#

当然,这很容易,但你需要写两个函数,一个带有累加器,像这样:

int str2int_rec(char *c, int accum)
{
    if (!c || !*c || !isdigit(*c))
        return accum;

    return str2int_rec(c + 1, accum * 10 + (*c - '0'));
}

int str2int(char *c)
{
    return str2int_rec(c, 0);
}
s2j5cfk0

s2j5cfk02#

好吧,你可以对使用该功能的人隐藏该功能。所以你将有一个名为int str2int(char *str)的函数,它将在此后调用int str2int(char *c, int *i)
我以前就是这么做的。

1tuwyuhd

1tuwyuhd3#

我想你可以使用horner scheme来避免任何'i'。
你必须反转字符串(是的,退出丑陋),然后你可以简单地用途:

int str2int (char* str)
{
    if (*str+1)
    {
        return 10*str2int(str+1)+(*str-'0');
    }
    return 0;
}
ozxc1zmp

ozxc1zmp4#

一种方法是将数字的长度作为参数传递,这样我们就可以有效地向后读取:

int strtoi(char *c, size_t l)
{
    return l ? c[l-1] - '0' + 10 * strtoi(c, l - 1) : 0;
}

那就这样叫吧:

int i = strtoi("432", 3);

或者:

char *c = "432";
int i = strtoi(c, strlen(c));

但是,为字符串的长度而烦恼并不总是最佳的。另外,如果一个字符串在一个数字后面有字符,我们就必须手动计算,因为这个函数不会为我们做这件事。我们不能(不应该)在函数中使用strlen()来避免传递参数,因为这会导致每次重新计算字符串长度的速度大大降低。肯定有办法从一开始就做到这一点,即使我们不得不拿出重炮:

int strtoi(char *c)
{
    if(!isdigit(*c)) return 0;
    int i = strtoi(c + 1);
    return i + pow(10, (int)(log(i + 1)/log(10)) + (i != 0)) * (*c - '0');
}

不,(int)转换不是可选的。基本上,所有的数学计算10的幂,我们需要乘以我们当前的数字,基于最后一次递归调用返回的数字。
我知道这可能是一个学习练习,但递归并不是编程的全部。在某些语言中,对于某些任务,这是一些人,包括我自己,会称之为美丽的,但从它的外观来看,这不是其中之一。

qyzbxkaa

qyzbxkaa5#

使用递归甚至处理输入零
public static int getString(String s){
if(s.length()==1){

if(s.charAt(0)==0)
        return s.charAt(0)-'0';
        else{
            return s.charAt(s.length()-1)-'0';
        }
    }
    
    
    
    int a = convertStringToInt(s.substring(0,s.length()-1));
    int b = a*10+(s.charAt(s.length()-1)-'0');
    return b;
}

}

相关问题