切换两个长度相同的字符串循环

时间:2016-08-26 08:58:20

标签: c++ switch-statement

我有一个切换不同字符串长度的switch case: 意思

switch(x.GetLength())
{
case 0 // means string length is 0
... and so on


}

我面临的问题是有两个长度相同的字符串为6,所以我将有两个具有相同数字的情况

案例6

案例6

第一种情况下的字符串总是以数字的形式出现,不包含任何字母/字符

第二种情况下的字符串总是在字符串的开头带有字符P.

我想在两种情况之间进行分类:我尝试的是切换 (x.GetLength(),X.GetAt(0))

但它给出了一个错误,即case表达式不是常量 否则我不能有两个具有相同数字的案例

switch(m_strScanned.GetLength(), X.GetAt(0)) // switch over String Length
{
case (6,2): // This case where the 6 digits are all numbers

WTN: if (m_strScanned.Mid(2,1).FindOneOf(".,/*-+ABCDEFGHIJKLMNOPQRSTUVWXYZ")>=0) goto Y;
if(m_strScanned.Mid(3,1).FindOneOf(".")>=0) goto X;
else
{
....
break;
}
case (6,'P'):
goto TYPE; // this is where the first digit is P

TYPE: if(m_strScanned.Mid(2,1).FindOneOf("ABCDEFGHIJKLMNOPQRSTUVWXYZ")>=0)
goto Y;
if(m_strScanned.Mid(3,1).FindOneOf(".")>=0) goto X;

else
{
....
break;
}

是否存在避免if else条件的解决方案

感谢您的帮助

3 个答案:

答案 0 :(得分:1)

没有仅使用switch语句和case标签的解决方案,您必须拥有一个case,然后使用例如在其中if选择正确的代码:

switch (m_strScanned.GetLength())
{
    ...

case 6:
    if (m_strScanned[0] == 'P')
    {
        // Handle this special case
    }
    else
    {
        // Handle this other special case
    }
    break;

    ...
}

答案 1 :(得分:1)

坎。我很惊讶这个编译。案例标签需要是编译时可评估的常量表达式,但常量表达式不能包含逗号运算符!

认为您的(因此非标准合规)编译器会将case (6,2)视为case 2而将switch(m_strScanned.GetLength(), X.GetAt(0))视为switch (X.GetAt(0)),因为逗号运算符有效。甚至可能(尽管我认为不太可能)你可能有一个编译器扩展,将case (6, 2):视为case 6: case 2:,依此类推。但如果你利用它,那么你就放弃了可移植性。

没有什么可以阻止您在if中使用case 6块进一步消除歧义,或者完全放弃switch以支持if阻止。

答案 2 :(得分:0)

case 6:
  if('P'==x[0]) {
    // do something
  }
  else {
    // do something else
  }
  break;

这有什么问题?