我们可以在c中使用带有字符串的switch-case语句吗? [重复]

问题描述 投票:3回答:7

这个问题在这里已有答案:

int a = 0 , b = 0;
char* c = NULL;

int main(int argc , char ** argv){

    c = argv[2];
    a = atoi(argv[1]);
    b = atoi(argv[3]);

    switch(c){

        case "+": printf(a+b);
                  break;
    }

    printf("\n\n");

    return 0;
}
c string switch-statement
7个回答
3
投票

不,你不能。 switch的case标签需要是具有整数类型的编译时可评估常量表达式。

但像int这样的'+'文字符合这一要求。 (正如enum那样的价值观。)

有些人喜欢使用实现定义的多字符文字(例如'eax')作为case标签,因为他们声称它有助于提高可读性,但在那时,你放弃了跨不同平台的一致行为。

如果你需要分支一个以NULL结尾的qazxsw poi数组的值,那么使用qazxsw poi块。


2
投票

不,你不能。 Switch用于比较数字类型和扩展字符类型。相反,您应该使用字符串标头中包含的strcmp函数:

char

1
投票

不,那是不可能的。

引用if,章节§6.8.4.2

#include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, char * argv[]) { if (argc != 4) { puts("Incorrect usage"); return 1; } /* You should check the number of arguments */ char * op = argv[1]; int a = atoi(argv[2]); int b = atoi(argv[3]); /* You should check correct input too */ if (strcmp(op, "+") == 0) printf("%d + %d = %d\n", a, b, a + b); else if (strcmp(op, "-") == 0) printf("%d - %d = %d\n", a, b, a - b); /* Add more functions here */ return 0; } 语句的控制表达式应具有整数类型。


1
投票

在你的情况下,你似乎不需要字符串,而是需要在C11语句中传递的字符串的第一个(也是唯一的字符),在这种情况下,可以在switch语句中使用字符文字(具有整数类型):

switch

当字符串有多个字符时,case中描述了一些其他好的替代方法。


1
投票

答案有两种情况..

首先if (strlen(c)==1) { switch(c[0]){ case '+': printf(a+b); break; ... } } best way to switch on a string in C案)

switch语句的控制表达式应具有整数类型

其次6.8.4.2switch声明)

每个case标签的表达式应该是一个整型常量表达式,同一个switch语句中没有两个case常量表达式在转换后应该具有相同的值

长话短说 - 你不能像这样使用字符串文字。在切换控制表达式和6.8.4.2中都没有。

您可以使用case进行字符串比较,然后进行case调节。你问这个的上下文,你可以简单地传递字符strcmpif-else)而不是传递整个文字。那样你就会将+传递给argv[2][0]表达,然后相应地工作。


0
投票

不是直接的。但是,是的,你可以。

char

请记住,这是纯粹的,纯粹的魔术技巧,不适合大量的文本值。

此外,匹配的有效性完全取决于您预处理用户输入的程度。在此示例中,我们只忽略大小写,但更高级的应用程序可能会执行更复杂的匹配。


0
投票

正如其他人在C中指出的那样,不能使用字符串作为开关的参数,也不能使用case-labels。

为了解决这个限制,可以将每个字符串映射到特定的整数并将其传递给交换机。

查找映射需要搜索地图,这可以使用标准C switch函数完成。

示例可能如下所示:

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

// The way you store and search for names is entirely 
// up to you. This is a simple linear search of an 
// array. If you have a lot of names, you might choose
// a better storage + lookup, such as a hash table.
int find( const char** ss, int n, const char* s )
{
  int i = 0;
  while (i < n)
    if (strcmp( ss[i], s ) == 0) break;
    else                         i += 1;
  return i;
}

// A bevvy of little utilities to help out.
char* strupper( char* s )
{
  char* p = s;
  while ((*p = toupper( *p ))) ++p;
  return s;
}

char* zero( char* p ) { if (p) *p = 0; return p; }

#define STRINGIFY(S) STRINGIFY0(S)
#define STRINGIFY0(S) #S

int main()
{
  // Our list of names are enumerated constants with associated
  // string data. We use the Enum Macro Trick for succinct ODR happiness.
  #define NAMES(F) \
    F(MARINETTE) \
    F(ADRIAN) \
    F(ALYA) \
    F(DINO)
  #define ENUM_F(NAME) NAME,
  #define STRING_F(NAME) STRINGIFY(NAME),
  enum names { NAMES(ENUM_F) NUM_NAMES };
  const char* names[ NUM_NAMES ] = { NAMES(STRING_F) NULL };
  #undef STRING_F
  #undef ENUM_F
  #undef NAMES

  // Ask user for a name
  char s[ 500 ];
  printf( "name? " );
  fflush( stdout );
  fgets( s, sizeof( s ), stdin );
  zero( strchr( s, '\n' ) );

  // Preprocess and search for the name  
  switch (find( names, sizeof(names)/sizeof(*names), strupper( s ) ))
  {
    case MARINETTE: puts( "Ladybug!" ); break;
    case ADRIAN:    puts( "Chat Noir!" ); break;
    case ALYA:      
    case DINO:      puts( "Best friend!" ); break;
    default:        puts( "Who?" );
  }
}

如果在POSIX上,甚至可以使用哈希表,这是查找映射的最快方法。

示例可能如下所示:

bsearch()
© www.soinside.com 2019 - 2024. All rights reserved.