加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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实际上并没有什么特别的错误,也不要让货物狂热分子告诉您!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读