在C中使用字符串切换语句

时间:2011-11-28 22:23:30

标签: c switch-statement

  

可能重复:
  C/C++: switch for non-integers
  C/C++ switch case with string

我将字符串传递给函数get_band(char * str) 然后我将传递的参数与特定的字符串进行比较

if(strcmp(str, "auto"))
{
  //do something
}

我的问题是 - 因为我有很多字符串要比较,我如何使用switch语句而不是if / else,因为switch语句只支持整数类型。

6 个答案:

答案 0 :(得分:4)

简短回答:你不能。

答案很长:这个问题与C/C++ switch case with string重复。

答案 1 :(得分:3)

你可以这样做:

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

char *words[] = {"one", "two", "four"}; // words is an array of pointers to char

void f(char *str);

int main(void) {
    f("two");
    return 0;
}

void f(char *str) {

    int i;
    for (i = 0; i < sizeof words/sizeof words[0]; i++) {
        if (!strcmp(str, words[i])) {
            /* Do something */
        }
    }
}

答案 2 :(得分:1)

不,开关仅适用于整数。

如果要进行优化,可以使用一些数据结构来确定字符串是否是任何已知字符串。例如:

为了利用这样的数据结构,为每个已知字符串分配一个常数整数(例如define或enum);给定一个字符串,您可以使用数据结构将其映射到某个已知字符串的数字(可能有一些数字意味着“未知”)。 然后你可以使用这个号码的开关,并为每个案例做任何你想做的事。

你可以找到上述任何一种的现有实现,但是如果你是C的新手,那么自己实现它可能是有益的。

答案 3 :(得分:0)

switch语句根据评估以下表达式进行分支。

在您的情况下,strcmp仅承诺返回小于零,零或大于零的返回值。即使您假设这意味着-1,0和1(分别),这意味着您只能在切换案例中选择3个值。 [顺便说一下,这不是一个安全的假设......]

相反,如果你的字符串来自一组封闭的字符串(即只能有一组值),你可以对字符串进行标记。实际上有一些程序可以为你做这件事,即将字符串转换成代币。 (参见flex(1)。)这意味着您期望的每个字符串都有一些唯一值,您可以打开该值。

如果这太麻烦,只需使用您在问题中使用的方法,即:

if (strcmp("some string", str) == 0) {
   // handle some string
} else if strcmp("some other string", str) == 0) {
   // handle alternate case here

...

} else {
   // handle error/default case here
}

答案 4 :(得分:0)

考虑更改程序的逻辑以使用枚举而不是字符串。然后,您可以使用数组查找将整数枚举映射到相应的字符串,以进行显示和记录。包括哈希等在内的其他选项已被涵盖。

答案 5 :(得分:0)

C / C ++中的switch语句只接受三种大小写类型:整数,字符和枚举数据类型(这实际上是另一种表示整数的方式)。当评估为ascii代码时,字符也会减少为整数。

@Nikolai N Fetissov提出了一个很好的建议:打开字符串的哈希值:

#define hashOfString1 <integer hash goes here>
#define hashOfString2 <integer hash goes here>
#define hashOfString3 <integer hash goes here>

. . .

switch (hashMyString("MyString")) {
  case hashOfString1:
    /* do this */
    break;
  case hashOfString2:
    /* do that */
    break;
  case hashOfString3:
    /* do other */
    break;
  default:
    /* default behavior */
    break;
}