在尝试将变量放入切换案例时,我遇到了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.
答案 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开关盒仅适用于整数或单字符类型。