C++ 在两个长度相同的字符串上循环切换大小写

C++ 在两个长度相同的字符串上循环切换大小写,c++,switch-statement,C++,Switch Statement,我有一个开关盒,它在不同字符串的长度上循环: 意义 我面临的问题是,有两个字符串的长度相同6,因此我将有两个相同数字的案例 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(".,/*-+ABC

我有一个开关盒,它在不同字符串的长度上循环: 意义

我面临的问题是,有两个字符串的长度相同6,因此我将有两个相同数字的案例

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;
}
案例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
来选择正确的代码:

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

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

    ...
}

怎么了?

哼。我很惊讶这个汇编。大小写标签需要是编译时可计算的常量表达式,但常量表达式不能包含逗号运算符

我认为,由于逗号运算符的工作方式,您的(因此非标准的)编译器将把
case(6,2)
视为
case2
switch(m_strScanned.GetLength(),X.GetAt(0))
视为
switch(X.GetAt(0))
。甚至有可能(尽管我认为不太可能)有一个编译器扩展将
案例(6,2):
视为
案例6:case2:
等等。但是如果你利用它,那么你就放弃了可移植性


没有什么可以阻止您在
案例6
中使用
if
块进行进一步的描述,或者完全放弃
开关以使用
if
块。

为什么不让扫描仪返回枚举值而不是字符串?
案例(6,2)
不应该编译(请参阅我的答案)。是吗?它没有错,但我想说的是,如果第一个字符是从A到Z的字母表之一,但是函数.FindOneOf(“ABC…Z”)在这种情况下没有帮助。你的意思是像
If(x[0]>='A'&&x[0],而不是x[0],那么整个字符串x就是你要找的。如果它不在“A..Z”中,则
//执行其他操作
,否则
//执行操作
,但我想说的是,如果第一个字符是从A到Z的字母表中的一个,但函数.FindOneOf(“ABC…Z”)在这方面没有帮助case@HeshamMahmoud使用如何?
case 6:
  if('P'==x[0]) {
    // do something
  }
  else {
    // do something else
  }
  break;