Switch case字符串

从人皆知,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,我们一起学习一起进步。                                                                                                             ---------某大一计算机小白一枚

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值