从人皆知,Switch case语句在选择结构中使用效率非常之高,但是其也有一定的局限性,switch语句中只可以放数字变量和单一字符,但是在实际问题的处理过程中,switch字符串如果可以实现的话就可以解决一些特定的问题从而提供便利。
这里以c++为例,提供一种switch字符串的思路
以下代码显然是会报错的
#include<iostream>
#include<cmath>
#include<string>
using namespace std;
int main(){
string a;
cin>>a;
switch (a)
{
case "abc":
printf("1");
break;
default:
printf("2");
break;
}
return 0;
}
在反复捣鼓的过程中在把case1中的abc用单引号括起来后把鼠标放在上面可以发现其存储的类型为(int)011000010110001001100011,也就是说我们在定义一个变量c,使其通过一些函数将输入的abc转换成case里的(int)6382179就可以实现switch字符串,那么问题就变成了abc是如何转换成6382179,搜集大量资料后惊奇的发现原来这个数是abc分别对应八位二进制ASCII码即01100001,01100010,01100011整合011000010110001001100011所对应的十进制数就是6382179,因此我们只需编写函数实现该功能实现模块化处理即可,代码如下
#include<iostream>
#include<cmath>
#include<string>
using namespace std;
int tobin(char a){ //将单个字符变成八位二进制数
int aa,ans=0,n=1,i,b[8]={0};
aa = (int)a; //字符a的ASCII码为97,这里aa就是97
for(i=7;i>=0;i--){
b[i]+=(aa%2);
aa/=2;
}
for(i=7;i>0;i--){
ans+=(n*b[i]);
n*=10;
}
return ans; //a的话就返回->01100001,最高位为0对后面结果没影响
}
int bian(string a){ //字符串变成其对应的case中的数字
int ans=0,k,m,n,flag=8;
k=a.length(); //获取字符串长度
m=(k-1)*8; //最高位处理
for(int i=0;a[i]!='\0';i++){
n=tobin(a[i]);
do{
flag--;
ans+=(n%10*pow(2,m));
m++;
n/=10;
}while(flag>0);
flag=8; //确保循环八次
k--;
m=(k-1)*8;
}
return ans;
}
完整代码如下
#include<iostream>
#include<cmath>
#include<string>
using namespace std;
int tobin(char a){ //将单个字符变成八位二进制数
int aa,ans=0,n=1,i,b[8]={0};
aa = (int)a; //字符a的ASCII码为97,这里aa就是97
for(i=7;i>=0;i--){
b[i]+=(aa%2);
aa/=2;
}
for(i=7;i>0;i--){
ans+=(n*b[i]);
n*=10;
}
return ans; //a的话就返回->01100001,最高位为0对后面结果没影响
}
int bian(string a){ //字符串变成其对应的case中的数字
int ans=0,k,m,n,flag=8;
k=a.length(); //获取字符串长度
m=(k-1)*8; //最高位处理
for(int i=0;a[i]!='\0';i++){
n=tobin(a[i]);
do{
flag--;
ans+=(n%10*pow(2,m));
m++;
n/=10;
}while(flag>0);
flag=8; //确保循环八次
k--;
m=(k-1)*8;
}
return ans;
}
int main(){
string a;
int c;
cin>>a;
c=bian(a);
switch (c)
{
case 'abc':
printf("1");
break;
default:
printf("2");
break;
}
return 0;
}
输入abc后终端返回结果为“1”,由此可见switch字符串得以实现。
总结:此方法可以使用但是在执行过程中爆出了warning,并且遇到长一点的字符串转换的数字可能会超越int的范围,只有在特定的情况下有明显的用途,但是该方法为Switch case打开了新思路,具有一定的意义,代码和思路仅供参考,愿各位大佬献出您宝贵的意见和建议,希望各位动动小手点个小赞,您的支持是我创作的最大动力,这是我的第一篇Blog,我们一起学习一起进步。 ---------某大一计算机小白一枚