【问题标题】:Invalid conversion from "char" to "char *"从“char”到“char *”的无效转换
【发布时间】:2013-05-24 16:50:14
【问题描述】:

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

我们得到了char Roman_num[20] 对于每个元素,sum+=value(Roman_num[i])。函数原型为int value (char digit)。导致'Invalid conversion from char to char *'错误。

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

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

感谢您的帮助。另一方面,你能推荐一些深入理解C语言的书吗?我现在正在使用 C : How To Program 这本书,我几乎不知道变量、函数在内部是如何工作的,以便更深入地理解。

这是代码:

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 value( char *digit )
  • 我们需要查看实际代码,而不是脱节的sn-ps。问题出在你没有向我们展示的东西上。
  • 请张贴代码。没有我们面前的来源,我们无法提供太多帮助。
  • char Roman_num[20] For each element, sum+=value(Roman_num[i]).The function prototype is int value (char digit) 他们所说的错误在这种情况下不会发生。
  • 大胆猜测:你写了switch case (*digit)Visual Basic 风格。

标签: c function switch-statement character


【解决方案1】:

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


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

【讨论】:

  • 这是一种“危险”的字符串处理方式吗?只要您传递了一个以 NUL 结尾的字符串,就没有任何问题。
  • 我总是喜欢使用已知长度而不是“假设”。事实是,每当我使用这样的 C 字符串时,我都会感到有些不安。
  • 这是很好的教学代码,但算法有缺陷。以 IX 为例。哪个应该是 9 而不是 11? +1 虽然很好的答案。
  • 正如我所说,减法部分留给他。我只是想在那里获得一个代码示例,该示例显示如何在接近他工作的情况下使用 switch 语句。
  • @Bathsheba:我们使用 if 选择:如果输入字符串 [strlen[输入字符串]-2]=='I' 然后 sum-=2。罗马数字中最右边的数字位于(字符串长度 -1),所以第二个最右边的数字,即字符串“IV”中的“I”,位于(字符串长度 -2)如果该位置是 'I ',然后我们将总和减去 2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-09
  • 2017-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多