zhangke 发表于 2019-6-28 15:02:22

C语言中switch可以用文字判断嘛

我这个是错误的,,       
printf("请输入您要查找的用户姓名:");
        char i;
        scanf("%s",&i);
        switch(i){
                case '张一':
                        z();
                        break;
                case '王二':
                        w();
                        break;
        }

newu 发表于 2019-6-28 15:06:42

不允许这种写法。其次,在C中单引号值的是一个char类型的字符。不能是汉字,更不能是两个汉字了。

zhangke 发表于 2019-6-28 15:11:03

newu 发表于 2019-6-28 15:06
不允许这种写法。其次,在C中单引号值的是一个char类型的字符。不能是汉字,更不能是两个汉字了。

所以switch不能用文字判断嘛

bin554385863 发表于 2019-6-28 15:16:15

zhangke 发表于 2019-6-28 15:11
所以switch不能用文字判断嘛

这要自己指定字符集才行吧

zhangke 发表于 2019-6-28 15:21:26

bin554385863 发表于 2019-6-28 15:16
这要自己指定字符集才行吧

我也不清楚{:10_266:}

newu 发表于 2019-6-28 15:47:03

zhangke 发表于 2019-6-28 15:11
所以switch不能用文字判断嘛

不能

Krant5 发表于 2019-6-28 15:58:58

在Java里面支持字符串,就可以

迷雾少年 发表于 2019-6-28 21:13:20

C++可以
//这个只是计算字符串hash的一个方法而已
constexpr const int Calc(const char *p)
{
        int i = 0;
        int hash = 0;
        while (*p)
        {
               
                hash =hash*1423+ (*p);
                p++;
               
        }
        return hash&0x7FFFFFFF;
}
int main()
{
        char buf = { 0 };
        cin >> buf;
        switch (Calc(buf))
        {
        case Calc("hello"):
                cout << "hello";
                break;
        case Calc("gg"):
                cout << "gg";
                break;
        default:
                cout << "没有";
                break;
        }
return 0;
}

newu 发表于 2019-6-29 11:55:08

迷雾少年 发表于 2019-6-28 21:13
C++可以

所以这个最终比较的也是int型变量。

迷雾少年 发表于 2019-6-29 15:39:06

newu 发表于 2019-6-29 11:55
所以这个最终比较的也是int型变量。

不管比较的是什么,达到目的就行了 也就打多几个函数名字的功夫

迷雾少年 发表于 2019-6-29 15:39:42

newu 发表于 2019-6-29 11:55
所以这个最终比较的也是int型变量。

只不过C++才可以

newu 发表于 2019-6-29 15:53:01

迷雾少年 发表于 2019-6-29 15:39
只不过C++才可以

注意楼主的题目是:swith可以用文字判断嘛

1 你的这种函数的方法C也可以
2 固然你的方法可行,但不符合楼主提问的意思

迷雾少年 发表于 2019-6-29 18:27:58

newu 发表于 2019-6-29 15:53
注意楼主的题目是:swith可以用文字判断嘛

1 你的这种函数的方法C也可以


C没有C++里的constexpr,想知道怎么做到这种方法。

newu 发表于 2019-6-29 18:42:51

迷雾少年 发表于 2019-6-29 18:27
C没有C++里的constexpr,想知道怎么做到这种方法。

constexpr本质上就是给编译器看的,也就是在编译阶段就确定了的东西,

那我在C中为什么不能写个宏提前把你的hash值算好呢?一样的。

迷雾少年 发表于 2019-6-29 18:54:32

newu 发表于 2019-6-29 18:42
constexpr本质上就是给编译器看的,也就是在编译阶段就确定了的东西,

那我在C中为什么不能写个宏提前 ...

求参考代码

newu 发表于 2019-6-29 19:26:20

迷雾少年 发表于 2019-6-29 18:54
求参考代码

代码我没有写,我是这样想的,既然c++的新特性都可以实现,那在C里面实现只不过比较麻烦而已。

我的几点猜想,
C++中的case后边是不是真的C中的Case呢,又或者只是个if...else
如果真的是C中的case的话,那么它这个表达式肯定是在编译阶段就算好的

所以说如果要在C中实现的话,用你的这种算字符串摘要的方法,也可以用if..else...if...else..

迷雾少年 发表于 2019-6-29 19:29:00

newu 发表于 2019-6-29 19:26
代码我没有写,我是这样想的,既然c++的新特性都可以实现,那在C里面实现只不过比较麻烦而已。

我的几 ...

我试了 按你说的写个宏函数编译器期计算出hash值编译器无法通过 甚至case ((int)2+(int)"0"):这样确定的常量都不行 我用C做不到我C++那样的函数的方法,所以想知道你怎么实现那种函数的方法

newu 发表于 2019-6-29 19:38:29

迷雾少年 发表于 2019-6-29 19:29
我试了 按你说的写个宏函数编译器期计算出hash值编译器无法通过 甚至case ((int)2+(int)"0"):这样确 ...

不写了,太累了{:10_266:}

我上边说了我的想法,一种方式就是写宏定义查表,另一种放到if...else

迷雾少年 发表于 2019-6-29 19:45:33

newu 发表于 2019-6-29 19:38
不写了,太累了

我上边说了我的想法,一种方式就是写宏定义查表,另一种放到if...else

if-else就不是主题了,有空的时候麻烦帮我写下我上面C++那种实现的C版本,想学习学习。
页: [1]
查看完整版本: C语言中switch可以用文字判断嘛