switch 语句未检测到某些字符

switch statement not detecting some characters

本文关键字:字符 检测 语句 switch      更新时间:2023-10-16

我在C++中使用了switch 语句作为简单的菜单。除了 2 种情况外,一切都有效,字母 'U''l' ,在运行时使用时,就像一个永远不会被填充的cin语句。无法输入其他选项,也无法通过输入字符来阻止它,必须实际按 Ctrl-Z 退出它。据我所知,语法是正确的,所有其他选项都有效。

编辑:即使删除同时完全导致同样的事情

cin >> command;
while(command!='Q')
{
  switch(command)
  {
     case 'L':
        le.left();
        break;
     case 'R':
        le.right();
        break;
     case 'I':
        cin >> str;
        le.insert(str);
        break;
     case 'D':
        le.erase();
        break;
     case 'C':
        cin >> c;
        le.change(c);
        break;
     case 'U':
        cout << "Applying uppercase";      //doesn't even print to screen
        upperList(le);
        cout << "Uppercase applied" << endl;
        break;
     case 'l':
        lowerList(le);
        break;
     case 'P':
        cout<<le;
        break;
     case 'Q':
        break;
     default:
        cout << "Invalid command.";
  }
  cin >> command;
}

le.insert:

void LineEditor::insert(const string& s)
{
for(int i=0;i<s.size();i++)
  L.insert(it, s.at(i));
itBegin=L.begin();  //iterator to beginning of list, used in <iterator>::distance later
}               

upperList 及其 ToUpper 函数:

char ToUpper(char c)
{
c=toupper(c);
return c;
}
void upperList(LineEditor le)
{
char c;
le.setBegin();
while(!le.end())
{
  c=le.at();
  le.apply(*ToUpper, c);
  le.right();
}
} 

和 le.end()

bool LineEditor::end() const
{
if(it!=L.end())
  return false;
else
  return true;
}

将其缩小到 LineEditor::setBegin()

void LineEditor::setBegin()
{
while(it!=L.begin())           //supposed to move iterator to beginning of list
  --it;
}

您的

cout << "Applying uppercase";

未打印,因为标准输出是行缓冲的。你需要

cout << "Applying uppercase" << flush;

以刷新缓冲区。

此外,您的upperListlowerList函数显然进入了一个无限循环,这意味着在LineEditor内部实现的迭代逻辑以某种方式被破坏了。

此外,看起来您将字符串本身作为成员保留在LineEditor对象内L。同时,您将LineEditor传递给upperList按值lowerList。这意味着在 upperListlowerList 内部所做的任何更改都不会对调用代码的le产生任何影响,因为 upperListlowerList 将在 LineEditor 的独立副本上工作。