注册 登录
编程论坛 C++教室

switch语句问题

doom5211 发布于 2007-06-24 16:06, 2141 次点击
在学习C++ Primer时遇见一个习题,关于switch语句的.
题目如下(我把它改了一下,因为书上题目出的很简单,是结合书中的一个例子的扩展).
用switch语句写一个字符记数的程序,输入一段字符序列,能够记录其中如下双字符出现的次数:ff、fl、fi。
我的程序如下:
#include<string>
#include<iostream>
using namespace std;
void main()
{
string ch;
int ffcnt=0,flcnt=0,ficnt=0;
while(cin>>ch)
{
switch(ch)
{
case'f':
while(cin>>ch)
{
switch(ch)
{
case'f':
++ffcnt;
break;
case'l':
++flcnt;
break;
case'i':
++ficnt;
break;
default:
break;
} //结束第二个switch语句
} //结束第二个while语句
default:
break;
} //结束第一个switch语句
} //结束第一个while语句
cout<<"numble of ff:\n"<<ffcnt<<endl;
cout<<"numble of fl:\n"<<flcnt<<endl;
cout<<"numble of fi:\n"<<ficnt<<endl;
}
我在这里用了一个switch的嵌套,不知道可以不可以,我的用意就是当出现一个f时就再用第二个switch来判断接下来的第二个字符是否为f,l,i中的任意一个。
但编译出问题。Error C2450: switch expression of type 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' is illegal
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
8 回复
#2
aipb20072007-06-24 16:17

嵌套是允许的,但是一般不这样用。

并且switch中的条件要是整形值,string 不行,可以换成char。

#3
aipb20072007-06-24 16:19

这样改吧:
[CODE]#include<string>
#include<iostream>
using namespace std;
void main()
{
char ch1,ch2;
int ffcnt=0,flcnt=0,ficnt=0;
while(cin>>ch1>>ch2)
{
switch(ch1)
{
case'f':
switch(ch2)
{
case'f':
++ffcnt;
break;
case'l':
++flcnt;
break;
case'i':
++ficnt;
break;
default:
break;
} //结束第二个switch语句
//结束第二个while语句
default:
break;
} //结束第一个switch语句
} //结束第一个while语句
cout<<"numble of ff:\n"<<ffcnt<<endl;
cout<<"numble of fl:\n"<<flcnt<<endl;
cout<<"numble of fi:\n"<<ficnt<<endl;
}[/CODE]

#4
HJin2007-06-24 16:23

[CODE]string ch;
...
switch(ch)[/CODE]
switch ( expression )
case constant-expression : statement
[default : statement]


The expression must be of an integral type or of a class type for which there is an unambiguous conversion to integral type. Integral promotion is performed as described in Integral Promotions.

#5
neverDie2007-06-24 16:30
原来如此,swich要是整数。
#6
游乐园2007-06-24 19:41
匹配错误
定义时的ch是字符串型, 而switch匹配的是字符型

按照你的思路,这样改下吧


#include<cstdio>
#include<iostream>
using namespace std;
void main()
{
    char ch;
    int flag=0,ffcnt=0,flcnt=0,ficnt=0;
    while((ch=getchar())!='\n')
    {
       switch(ch)
       {
          case 'f':if(flag) ++ffcnt;flag=1;break;
    default:
                switch(ch)
                {
                  case'l':
       if(flag) ++flcnt;flag=0;
                    break;
                  case'i':
       if(flag) ++ficnt;flag=0;
                    break;
                  default:
       flag=0;
                    break;
                }  //结束第二个switch语句
              break;
       }  //结束第一个switch语句
    }   //结束第一个while语句
  cout<<\"numble of ff:\n\"<<ffcnt<<endl;
  cout<<\"numble of fl:\n\"<<flcnt<<endl;
  cout<<\"numble of fi:\n\"<<ficnt<<endl;
}
#7
doom52112007-06-25 15:09
谢谢无限循环以及其他大虾的指点,我知道我出错的地方了,的确switch里的表达式要为整型的,而我用的是ch,是字符串类型,的确不匹配。
但我的题目是要考虑要输入一个字符序列,按照几位大虾改的只能输入两个字符(也许是我还没有看懂,汗!)是否这样的修改不满足题目的要求啊。题目要求对于一个输入的字符序列,再来计算其中符合要求的双字符个数.
#8
aipb20072007-06-25 15:41
以下是引用doom5211在2007-6-25 15:09:07的发言:
谢谢无限循环以及其他大虾的指点,我知道我出错的地方了,的确switch里的表达式要为整型的,而我用的是ch,是字符串类型,的确不匹配。
但我的题目是要考虑要输入一个字符序列,按照几位大虾改的只能输入两个字符(也许是我还没有看懂,汗!)是否这样的修改不满足题目的要求啊。题目要求对于一个输入的字符序列,再来计算其中符合要求的双字符个数.

我那个不可以,但是6楼游乐园大哥的可以,你仔细看看他的代码吧!

#9
zjh1712011-01-15 20:55
我亲自运行了一下程序,发现 aipb2007 的程序并没有错,
我亲自运行了一下程序,发现 aipb2007 的程序并没有错,但是,确实逻辑上有问题,麻烦问一下,这究竟是为什么
这可能涉及到我的 cin 语句以及右移操作符的深入了解,我也许还没有了解到那种程度,还请各位指点

[ 本帖最后由 zjh171 于 2014-1-19 17:08 编辑 ]
1