为什么我的案例会给我错误?为什么我不能把变量放在开关案例中?

时间:2014-09-05 17:42:16

标签: c variables switch-statement

在尝试将变量放入切换案例时,我遇到了2个错误:

#include <stdio.h>
int main(int argc, char *argv[]) {
  float conversie = 0;
  float leu = 1;
  float usd = 3.6 * leu;
  float eur = 4.4 * leu;
  float aur = 139 * leu;
  float suma;
  float valoare;
  char tipmoneda;
  printf("introdu moneda pe care vrei sa o schimbi:");
  scanf("%c\n", &tipmoneda);
  switch (tipmoneda) {
  case 'usd':

  default:
    break;
  }

}

这些是错误:

Untitled.c:14:8: warning: multi-character character constant [-Wmultichar] case 'usd': ^
Untitled.c:14:8: warning: overflow converting case value to switch condition type (7697252 to 100) [-Wswitch]
2 warnings generated.

4 个答案:

答案 0 :(得分:2)

如果您在输入行输入"usd",则无效; scanf只会将前导'u'字符读取并存储到tipmoneda(与多字符常量'usd'不匹配)。另外,为了安全起见,您应在scanf控制字符串中添加前导空格:

scanf( " %c", &tipmoneda );

这将告诉scanf跳过任何前导空格。

您可以做的只是为usd输入'u',为'e'输入eur,为'a'输入aur,然后按如下方式切换:

switch( tipmodena )
{
  case 'u' : 
    // process for usd
    break;

  case 'e':
    // process for eur
    break;

  case 'a':
    // process for aur
    break;

  default:
    // unrecognized option
    break;
}

修改

如果确实想要输入“usd”而不是“u”,则可以执行以下操作:

#include <ctype.h>   // needed for the tolower call below
...
char tipmoneda[4] = {0}; // read tipmoneda as a 3-character string instead of
                         // a single char
...
scanf( "%3s", tipmoneda ); // note conversion specifier
switch( tolower( tipmoneda[0] )) // switch on lowercase form of first letter
{
  // same cases as above
}

tolower调用会将参数转换为小写,因此您可以输入"usd""USD""Usd"等,但仍然可以执行此操作。请注意,如果输入的字符串长度超过3个字符,则其余字符将保留在输入流中,可能会导致下一个scanf调用。

答案 1 :(得分:1)

'usd'是一个多字符整数常量(带有可移植性问题),但tipmodena只是1 char。需要一种新的方法。

下面在编译时从3 char形成大小写常量。在运行时,字符串读取形成整数以便以相同的方式打开。

[编辑]
重写哈希函数以处理已签名的char,签名char和潜在的16位int的溢出移位。

#include <stdio.h>
#include <string.h>

#define HASH(a,b,c) \
    ((unsigned char)(a)*0x10000u + (unsigned char)(b)*0x100u + (unsigned char)(c))

int main(void) {
  char denom[4] = { 0 };
  while (scanf("%3s", denom) == 1) {
    switch (HASH(denom[0],denom[1],denom[2])) {
      case HASH('u', 's', 'd'):
        puts("usd");
        break;
      case HASH('e', 'u', 'r'):
        puts("eur");
        break;
      case HASH('a', 'u', 'r'):
        puts("aur");
        break;
      default:
        printf("Unknown '%s'\n", denom);
    }
    memset(denom, 0, sizeof denom);
  }
  return 0;
}

答案 2 :(得分:0)

这只是语言定义的一部分。您只能对案例值使用常量表达式。示例包括数字和字符文字以及先前定义的常量。

从技术上讲,'usd'是一个多字符常量,它被解释为一个数值。请参阅Multiple characters in a character constant以供参考。 对于便携式代码,这通常不是一种明智的做法。

这似乎也与海报的推断意图相冲突。海报似乎试图将货币作为字符串读取,并根据该输入计算总数。目前,此代码将读取单个字符并打开该值。

答案 3 :(得分:0)

C开关盒仅适用于整数或单字符类型。