将字符串转换为整数递归 - c编程

时间:2016-11-29 18:09:32

标签: c

我试图转换包含数字的字符串。数字是千分之一点。我用sscanf(input, "%i.%i", &first, %second); return first * 1000 + second;

制作了一个简单的解决方案

这没关系,但它有其局限性,因为它只适用于低于1.000.000的数字。我试过这个递归,但我的程序不会编译。也许你们其中一个人,可以看到错误。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char* concat(const char *s1, const char *s2) {
    char *result = malloc(strlen(s1)+strlen(s2)+1);//+1 for the zero-terminator
    strcpy(result, s1);
    strcat(result, s2);
    return result;
}

char *convert_spectators( char *input)                                 //
{
    char fir[3], sec[100];
    int scan_res = sscanf(input, "%3[0123456789]%*[^0123456789]%s", fir, sec);

    if (scan_res == 2) {
        return concat(fir, convert_spectators(sec));
    } else if (scan_res == 1) {
        return fir;
    }

}

int main() {
    printf("Result: %i\n", atoi(convert_spectators("123.456.789")));
    return 1;
} 

2 个答案:

答案 0 :(得分:1)

来自convert_spectators()的

您将返回“fir”,这是一个本地数组。这是错误的。我修改了你的代码并从调用函数传递了fir和sec。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char* concat(const char *s1, const char *s2) {
    char *result = malloc(strlen(s1)+strlen(s2)+1);//+1 for the zero-terminator
    strcpy(result, s1);
    strcat(result, s2);
    return result;
}

char *convert_spectators( char *input, char *fir, char *sec)                                 //
{
    int scan_res = sscanf(input, "%3[0123456789]%*[^0123456789]%s", fir, sec);

    if (scan_res == 2) {
    char firTemp[4]   = "";
    char secTemp[100] = "";
        return concat(fir, convert_spectators(sec, firTemp, secTemp));
    } else if (scan_res == 1) {
        return fir;
    } else {
        printf("Something wrong, scan_res[%d]\n", scan_res);
        return NULL;
    }

}

int main() {
    char fir[4]   = "";
    char sec[100] = "";

    printf("Result: %i\n", atoi(convert_spectators("123.456.789", fir, sec)));
    return 1;
} 

答案 1 :(得分:0)

这可以在没有scanf

的情况下完成
int convert(char *s, int n) {
    if (!*s || n >= 1000000000)
        return n;

    if (*s >= '0' && *s <= '9')
        n = n * 10 + *s - 48;

    return convert(s+1, n);
}

int main() {
    char *str = "123.456.789";
    printf("%d\n", convert(str, 0));
}

这将只解析字符串,并跳过任何非数字字符。并在字符串的末尾或结果溢出32位时停止。

如上所述,您连接每个子字符串并转换为整数的方式很好,但您在函数convert_spectators()中返回一个本地数组。您需要在调用函数之前在本地声明该数组,或将其设置为全局。