我在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;
}
答案 0 :(得分:0)
您
cout << "Applying uppercase";
不打印,因为标准输出是行缓冲的。你需要
cout << "Applying uppercase" << flush;
刷新缓冲区。
此外,您的upperList
和lowerList
函数显然会进入无限循环,这意味着在LineEditor
内实现的迭代逻辑会以某种方式被破坏。
此外,看起来您将字符串本身作为LineEditor
成员保留在L
对象中。同时您按价值将LineEditor
传递给upperList
和lowerList
。这意味着在upperList
和lowerList
内完成的任何更改都不会对调用代码中的le
产生任何影响,因为upperList
和lowerList
将会起作用LineEditor
的独立副本。