我有一个C代码块,用来确定给定的罗马数字的阿拉伯数字。问题是,这段代码只给出了数字8。
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;
}如能提供任何帮助,将不胜感激:)
发布于 2022-02-19 00:03:09
您不能使用==来比较字符串。当您这样做时,您正在比较地址,两个具有相同内容的字符串可以位于不同的地址。
由于roman中的子字符串后面没有空终止符,所以不能将它们作为普通字符串来使用strcmp()。但是您可以使用strncmp(),它允许您指定要比较的字符数。您可以用这种方式比较从索引开始的roman的子字符串和romanNumerals中的字符串。
为了使这项工作最容易,您可以重新排序的romanNumerals,以便两个字符的字符串在他们的一个字符的前缀。否则,例如,当roman包含IX时,在到达数组中的IX之前,您将匹配I。
不能使用sizeof array / sizeof array[0]获取作为参数传递给函数的数组的长度,因为该参数是指针而不是数组。对于字符串,可以使用strlen()获取其长度,但对于romanNumerals,则需要在调用方中获取长度,并将其作为显式参数传递。
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;
}https://stackoverflow.com/questions/71180996
复制相似问题