c – 如何在开关盒中消除goto的使用
发布时间:2020-12-16 10:51:44 所属栏目:百科 来源:网络整理
导读:基本上我想接受来自用户的特定字符,然后使用switch case将它与该字符大小写相关的字符串传递给另一个函数.例如. case i:strcpy(str,"ice-cream"); other_function(str); break; 如果用户打印了任何默认字符,那么它应该打印默认语句并再次从用户获取字符并检
基本上我想接受来自用户的特定字符,然后使用switch case将它与该字符大小写相关的字符串传递给另一个函数.例如.
case i:strcpy(str,"ice-cream"); other_function(str); break; 如果用户打印了任何默认字符,那么它应该打印默认语句并再次从用户获取字符并检查其大小写.我用goto做了这个,但有没有其他选项可以避免或替换此代码中的goto. p: { cout<<"Choose account type:-n"<<"Enterns :-savingnc :-currentnf :-fixednr :-recurring"<<endl; char c; cin>>c; switch(c) { char t[20]; case 's': strcpy(t,"saving"); a[i].setype(t); break; case 'c': strcpy(t,"current"); a[i].setype(t); break; case 'f': strcpy(t,"fixed"); a[i].setype(t); break; case 'r': strcpy(t,"reccurring"); a[i].setype(t); break; default: cout<<"Enter valid account type"<<endl; goto p; } } 解决方法
整个开关应该被放入一个函数中,并且它的返回值用于确定接下来循环发生了什么.
while (true) { std::cout << "Choose account type:n" << std::flush; char c; if (cin >> c) { const bool result = HandleUserInput(a[i],c); if (result) break; else std::cout << "Enter valid account typen"; } else { // Input error - you'll want to do something about that } } 和: // Given a character representing an account type,sets // the type of 'account' as appropriate. Returns false // on failure. bool HandleUserInput(Account& account,const char c) { switch (c) { case 's': a[i].setype("saving"); return true; case 'c': a[i].setype("current"); return true; case 'f': a[i].setype("fixed"); return true; case 'r': a[i].setype("recurring"); return true; default: return false; } } (请注意我是如何摆脱strcpy的,这似乎不是必要的?取决于我猜想哪种setype [哪种拼写错误].另外,对于奖励积分,考虑使用地图而不是开关,如果你不喜欢关心一点性能.) Bathsheba的建议是一个有效的选择,虽然我建议在一个开关内部返回看起来比继续看起来更清晰,因为后者在其他类型的控制流程语句中具有意义,而前者从未这样做. 另请注意,如果您出于某种原因决定不使用某项功能,那么您的goto实际上并没有什么特别的错误,也不要让货物狂热分子告诉您! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |