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

时间:2013-05-24 16:50:15

标签: c function switch-statement character

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

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

但是,当将每个元素的地址&a[i]传递给函数并将原型更改为int value (char *digit)时,它不会重复此错误,但会导致此开关中的另一个错误(在函数内部) ):switch (*digit)给出错误'digit'不能出现在常量表达式中

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

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

这是代码:

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;
}

1 个答案:

答案 0 :(得分:2)

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


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值。