从“char”到“char *”的转换无效

这是将罗马数字(例如VI)转换为小数的程序。 该算法正在编写一个函数,该函数识别输入字符串的每个元素并返回十进制的相应值。

我们得到char Roman_num[20]对于每个元素, sum+=value(Roman_num[i]) 。函数原型是int value (char digit)它导致’ 从char转换为char *的无效转换’错误。

但是,当将每个元素的地址&a[i]传递给函数并将原型更改为int value (char *digit) ,它不会重复此错误,但会导致此switch-case中的另一个错误(在函数内部): switch (*digit)给出‘digit’错误不能出现在constant-expression中

我的问题是我不清楚:在这个例子中,我们是否必须只将地址传递给函数? 如果我们想传递值,单个字符值,那么如何? 最后但并非最不重要的是,*数字实际上是一个单个字符,那么为什么它不能出现在case()中的常量表达式中?

我将非常感谢你的帮助。 另一方面,你可以向我推荐一些书籍,以便深入了解C语言吗? 我现在正在使用C:How To Program book,我几乎不知道变量,函数如何在内部工作以便更深入地理解。

这是代码:

 int value (char *digit); int main (void) { char a[100]; int length,i,sum=0; printf("Enter your Roman number: "); fflush(stdin); gets(a); printf("\nThe Roman number that you have entered is %s",a); length=strlen(a); for (i=0;i<length;i++) { sum+=value(&a[i]); } printf("\nthen it is: %d",sum); getch(); return 0; } int value (char *digit) { int num; case ( *digit ){ case 'M': num=1000; break; case 'D': num=500; break; case 'C': num=100; break; case 'L': num=50; break; case 'X': num=10; break; case 'V': num=5; break; case 'I': num=1; break; } return num; } 

由于您不会发布代码,因此这里有一些代码用于获取始终增加的罗马数字。 减法部分留给你弄清楚。 我只发布这个,因为听起来你是自我教导,这是值得称道的:

 int romanToValue(const char c) { switch(c) // Only works with upper-case as lower case means different things. { case 'I' : return 1; case 'V' : return 5; case 'X' : return 10; case 'L' : return 50; case 'C' : return 100; case 'D' : return 500; case 'M' : return 1000; default: printf("Bad value in string %c\n", c); break; } return 0; } int romanToInt(const char *str) { int value = 0; int i; for(i=0; str[i]; i++) // Dangerous way to do strings, but works for a C example. { value += romanToValue(str[i]); } return value; } int main(void) { const char cstr[] = "VIII"; printf("value:%d\n", romanToInt(cstr)); return 0; } 

请注意, switch语句正在处理char值。