C89开关盒使用一套
C89 Switch case using a set
我正在尝试编写一个函数来检查输入是否为有效的双精度值。因为最近了解了switch/case/default这个功能,所以想用它来解决问题
switch(carrier[i]){
case ("+" || "-") : //case 1
if(kvcase == closed){
printf("Error! Invaled input\n");
}
else /*save sign and close case*/
break;
case '.' :
if(deccase == closed){
printf("Error! Invaled input\n");
}
else /*save comma and close case*/
break;
case '[0-9]' : //case 3
break;
case ' ':
printf("staring with whitespace\n");
break;
default:
printf("empty\n");
break;
}
回答问题请忽略代码资源。问题只是关于陈述案例的正确方法。
1) 案例 1 是否有效,或者我必须将其分成两个不同的案例
2) case 3 有效吗?我正在尝试使用一组数字。所以如果 char carrier[i] 是一个数字大小写匹配。我知道 isdigit() 函数,但我不想绕过这个问题,除非 switch case 不可能与集合一起工作。
额外信息:
- carrier ist 类型为 char* 并且已被赋予一个值
- 我正在用 gcc 编译,代码需要符合 c89 标准,不管是什么。
不,至少在你的意思是:"+" || "-"
的值是1,因为至少有一个操作数("+"
和"-"
) 的逻辑或运算符 ||
是非零的。
不是,C switch
中没有字符串或正则表达式匹配,单引号('
)的大小写是多字节字符。
请注意,除非您中断,否则案例会进入下一个案例,因此这样的代码有效:
case '+':
case '-':
(void) printf("+ or -\n");
break;
(请注意,您需要为 '+'
和 '-'
使用单引号以使其成为字符。您拥有的 "+"
和 "-"
是字符串,不要比较等于字符,并且无论如何都不能与 switch
正确匹配,请参阅 strcmp
。)
对于你的问题,语法如下:
switch (expr) {
case '1':
printf("expr=1");
case '2':
printf("expr=2");
break;
case '3':
printf("expr=3");
break;
}
所以:
- 情况 1 无效:使用
case '1': case '2':
。您的案例可能会编译但不会给出预期的结果("+"||"-"
可能解析为 1)。
- 案例 3 无效:您必须写下所有案例(从“0”到“9”)。
如果你想最小化它,使用 if:
if (c == '+' || c == '-') {
// ...
} else if (c == '.') {
// ...
} else if ('0' <= c && c <= '9') { // or isdigit(c)
// ...
} else {
// invalid character
}
Switch case 范围是 gcc 扩展
void foo(int ch)
{
switch(ch)
{
case 'A' ... 'Z':
case 'a' ... 'z':
printf("'%c' is a letter\n", ch);
break;
case '0' ... '9':
printf("'%c' is a digit\n", ch);
break;
case '+':
case '*':
case '-':
case '%':
case '/':
case '^':
printf("'%c' is a math operator\n", ch);
break;
default:
printf("'%c' is something else\n", ch);
break;
}
}
int main()
{
for(int x = 0; x < 50; x++)
{
foo(32+ rand() % 90);
}
}
The Question is only about the proper way to state a case.
the code needs to be in c89 standard
在标准 C 中每个案例只有 1 个常量。在 C89 中不使用 //
注释。
switch(carrier[i]) {
case `+`: /* Fall through */ /*Comment not required, but good style */
case `=`:
/* case 1 code here */
break;
case '.' :
if(deccase == closed) ...
break;
case '0' : /* Fall through */
case '1' : /* Fall through */
case '2' : /* Fall through */
case '3' : /* Fall through */
case '4' : /* Fall through */
case '5' : /* Fall through */
case '6' : /* Fall through */
case '7' : /* Fall through */
case '8' : /* Fall through */
case '9' :
/* case 3 */
...
break;
case ' ':
printf("staring with whitespace\n");
break;
default:
printf("empty\n");
break;
}
我正在尝试编写一个函数来检查输入是否为有效的双精度值。因为最近了解了switch/case/default这个功能,所以想用它来解决问题
switch(carrier[i]){
case ("+" || "-") : //case 1
if(kvcase == closed){
printf("Error! Invaled input\n");
}
else /*save sign and close case*/
break;
case '.' :
if(deccase == closed){
printf("Error! Invaled input\n");
}
else /*save comma and close case*/
break;
case '[0-9]' : //case 3
break;
case ' ':
printf("staring with whitespace\n");
break;
default:
printf("empty\n");
break;
}
回答问题请忽略代码资源。问题只是关于陈述案例的正确方法。
1) 案例 1 是否有效,或者我必须将其分成两个不同的案例
2) case 3 有效吗?我正在尝试使用一组数字。所以如果 char carrier[i] 是一个数字大小写匹配。我知道 isdigit() 函数,但我不想绕过这个问题,除非 switch case 不可能与集合一起工作。
额外信息: - carrier ist 类型为 char* 并且已被赋予一个值 - 我正在用 gcc 编译,代码需要符合 c89 标准,不管是什么。
不,至少在你的意思是:
"+" || "-"
的值是1,因为至少有一个操作数("+"
和"-"
) 的逻辑或运算符||
是非零的。不是,C
switch
中没有字符串或正则表达式匹配,单引号('
)的大小写是多字节字符。
请注意,除非您中断,否则案例会进入下一个案例,因此这样的代码有效:
case '+':
case '-':
(void) printf("+ or -\n");
break;
(请注意,您需要为 '+'
和 '-'
使用单引号以使其成为字符。您拥有的 "+"
和 "-"
是字符串,不要比较等于字符,并且无论如何都不能与 switch
正确匹配,请参阅 strcmp
。)
对于你的问题,语法如下:
switch (expr) {
case '1':
printf("expr=1");
case '2':
printf("expr=2");
break;
case '3':
printf("expr=3");
break;
}
所以:
- 情况 1 无效:使用
case '1': case '2':
。您的案例可能会编译但不会给出预期的结果("+"||"-"
可能解析为 1)。 - 案例 3 无效:您必须写下所有案例(从“0”到“9”)。
如果你想最小化它,使用 if:
if (c == '+' || c == '-') {
// ...
} else if (c == '.') {
// ...
} else if ('0' <= c && c <= '9') { // or isdigit(c)
// ...
} else {
// invalid character
}
Switch case 范围是 gcc 扩展
void foo(int ch)
{
switch(ch)
{
case 'A' ... 'Z':
case 'a' ... 'z':
printf("'%c' is a letter\n", ch);
break;
case '0' ... '9':
printf("'%c' is a digit\n", ch);
break;
case '+':
case '*':
case '-':
case '%':
case '/':
case '^':
printf("'%c' is a math operator\n", ch);
break;
default:
printf("'%c' is something else\n", ch);
break;
}
}
int main()
{
for(int x = 0; x < 50; x++)
{
foo(32+ rand() % 90);
}
}
The Question is only about the proper way to state a case.
the code needs to be in c89 standard
在标准 C 中每个案例只有 1 个常量。在 C89 中不使用 //
注释。
switch(carrier[i]) {
case `+`: /* Fall through */ /*Comment not required, but good style */
case `=`:
/* case 1 code here */
break;
case '.' :
if(deccase == closed) ...
break;
case '0' : /* Fall through */
case '1' : /* Fall through */
case '2' : /* Fall through */
case '3' : /* Fall through */
case '4' : /* Fall through */
case '5' : /* Fall through */
case '6' : /* Fall through */
case '7' : /* Fall through */
case '8' : /* Fall through */
case '9' :
/* case 3 */
...
break;
case ' ':
printf("staring with whitespace\n");
break;
default:
printf("empty\n");
break;
}