首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的函数只返回数字8?

为什么我的函数只返回数字8?
EN

Stack Overflow用户
提问于 2022-02-18 23:30:49
回答 1查看 43关注 0票数 -3

我有一个C代码块,用来确定给定的罗马数字的阿拉伯数字。问题是,这段代码只给出了数字8。

代码语言:javascript
复制
char * romanNumerals[13] = {"I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", "D", "CM", "M"};
int arabicNumbers[13] = {1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000};

char * prob2(char * roman) {
    int arabic = 0;
    int romanSize = (sizeof(roman)/sizeof(roman[0]));

    for (int i = 0; i < romanSize; i++) {
        int f_arabic = arabicNumbers[findArrayPos(romanNumerals, roman[i])];
        if (i+1 == romanSize) {
            arabic += f_arabic;
            break;
        }

        int s_arabic = arabicNumbers[findArrayPos(romanNumerals, roman[i+1])];
        if (f_arabic >= s_arabic) {
            arabic += (f_arabic);
        }
        else {
            arabic += (s_arabic-f_arabic);
        }
    }

    char * answer = (char*)malloc(sizeof(arabic)+1);
    sprintf(answer, "%i\n", arabic);
    return answer;
}

int findArrayPos(char ** arr, char find) {
    int foundAt = 0;
    for (int i=0;i<sizeof(arr);i++) {
        if (arr[i] == &find) {
            foundAt = i;
        }
    }
    return foundAt;
}

如能提供任何帮助,将不胜感激:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-19 00:03:09

您不能使用==来比较字符串。当您这样做时,您正在比较地址,两个具有相同内容的字符串可以位于不同的地址。

由于roman中的子字符串后面没有空终止符,所以不能将它们作为普通字符串来使用strcmp()。但是您可以使用strncmp(),它允许您指定要比较的字符数。您可以用这种方式比较从索引开始的roman的子字符串和romanNumerals中的字符串。

为了使这项工作最容易,您可以重新排序的romanNumerals,以便两个字符的字符串在他们的一个字符的前缀。否则,例如,当roman包含IX时,在到达数组中的IX之前,您将匹配I

不能使用sizeof array / sizeof array[0]获取作为参数传递给函数的数组的长度,因为该参数是指针而不是数组。对于字符串,可以使用strlen()获取其长度,但对于romanNumerals,则需要在调用方中获取长度,并将其作为显式参数传递。

代码语言:javascript
复制
char * romanNumerals[13] = {"IV", "IX", "I", "V", "XL", "L", "XC", "X", "CD", "D", "CM", "C", "M"};
int arabicNumbers[13] = {4, 9, 1, 5, 40, 50, 90, 10, 400, 500, 900, 100, 1000};

char * prob2(char * roman) {
    int arabic = 0;
    size_t romanSize = strlen(roman);
    size_t numeralsSize = sizeof romanNumerals / sizeof romanNumerals[0];

    for (int i = 0; i < romanSize; i++) {
        int f_arabic = arabicNumbers[findArrayPos(romanNumerals, &roman[i], numeralsSize)];
        arabic += f_arabic;
    }

    char * answer = (char*)malloc(sizeof(arabic)+1);
    sprintf(answer, "%i\n", arabic);
    return answer;
}

int findArrayPos(char ** arr, char *find, size_t len) {
    int foundAt = 0;
    for (int i=0;i<len;i++) {
        if (strncmp(arr[i], find, strlen(arr[i])) {
            foundAt = i;
        }
    }
    return foundAt;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71180996

复制
相关文章

相似问题

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