我们可以在c中使用带有字符串的switch-case语句吗? [重复]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我们可以在c中使用带有字符串的switch-case语句吗? [重复]相关的知识,希望对你有一定的参考价值。
这个问题在这里已有答案:
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("
");
return 0;
}
不,你不能。 switch
的case标签需要是具有整数类型的编译时可评估常量表达式。
但像int
这样的'+'
文字符合这一要求。 (正如enum
那样的价值观。)
有些人喜欢使用实现定义的多字符文字(例如'eax'
)作为case
标签,因为他们声称它有助于提高可读性,但在那时,你放弃了跨不同平台的一致行为。
如果你需要分支一个以NULL结尾的qazxsw poi数组的值,那么使用qazxsw poi块。
不,你不能。 Switch用于比较数字类型和扩展字符类型。相反,您应该使用字符串标头中包含的strcmp函数:
char
不,那是不可能的。
引用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 ", a, b, a + b); else if (strcmp(op, "-") == 0) printf("%d - %d = %d ", a, b, a - b); /* Add more functions here */ return 0; }
语句的控制表达式应具有整数类型。
在你的情况下,你似乎不需要字符串,而是需要在C11
语句中传递的字符串的第一个(也是唯一的字符),在这种情况下,可以在switch
语句中使用字符文字(具有整数类型):
switch
当字符串有多个字符时,case
中描述了一些其他好的替代方法。
答案有两种情况..
首先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.2(switch
声明)
每个case标签的表达式应该是一个整型常量表达式,同一个switch语句中没有两个case常量表达式在转换后应该具有相同的值
长话短说 - 你不能像这样使用字符串文字。在切换控制表达式和6.8.4.2中都没有。
您可以使用case
进行字符串比较,然后进行case
调节。你问这个的上下文,你可以简单地传递字符strcmp
(if-else
)而不是传递整个文字。那样你就会将+
传递给argv[2][0]
表达,然后相应地工作。
不是直接的。但是,是的,你可以。
char
请记住,这是纯粹的,纯粹的魔术技巧,不适合大量的文本值。
此外,匹配的有效性完全取决于您预处理用户输入的程度。在此示例中,我们只忽略大小写,但更高级的应用程序可能会执行更复杂的匹配。
正如其他人在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, '
' ) );
// 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()
以上是关于我们可以在c中使用带有字符串的switch-case语句吗? [重复]的主要内容,如果未能解决你的问题,请参考以下文章