在while循环结束时清除C ++字符串

时间:2015-06-09 03:49:54

标签: c++

在下面的代码中,我试图使用getToppings()方法输出披萨配料列表。我想在每个内部'while'循环结束时清除这个浇头列表(即每个新的披萨订单必须在没有浇头的情况下启动)。不幸的是,我发现无法清除我的listOfToppings字符串。当我明确使用.clear()方法时,前一个披萨的最后一个顶部被转移到新披萨。如何清除每个新披萨的listOfToppings?

int main()
{
   PizzaOrder pizza;
   string size;
   string toppingSelection;
   bool innerLoop = true;
   bool outerLoop = true;
   int currentToppingsNum;


   // Outer loop
   while (outerLoop)
   {
      // Outer loop

      ...

      // Inner loop
      while (innerLoop && currentToppingsNum < 5)
      {
         pizza.PizzaOrder::getToppings(list);
         cout << "Current Pizza: " << pizza.stringizeSize() << list << "\n\n";
         cout << "Select an item by number (0 when done): \n\n";
         ...
         cout << "Selection: ";
         ...
         ...
            pizza.displayPizza();
      } list.clear();
   }
   return 0;
}

...

void PizzaOrder::getToppings(string &listOfToppings)
{
   for (int i = 0; i < numToppings; i++)
      listOfToppings = listOfToppings + " + " + toppings[i];
}

2 个答案:

答案 0 :(得分:1)

通过稍微区别地构建代码,您可以避免使用明确的clear

由于每个订单都是新的披萨,您应该在外部循环中创建一个PizzaOrder对象。

int main() {

   while(true) {
     ...
     if ( size[0] == 'q' || size[0] == 'Q' ) {
       break;
     }
     PizzaOrder pizza;
     ...
     pizza.displayPizza();
   }
}

然而,正如Matt McNabb在评论中暗示的那样,原始代码存在很多其他问题。

通过在线检查程序运行此操作(http://www.gimpel.com/html/pcl.htm) 我收到以下警告/信息

  • 成员函数PizzaOrder::getSize(void)可以成为const
  • 忽略函数std::getline
  • 的返回值
  • 忽略函数PizzaOrder::setSize(int)
  • 的返回值
  • pizza.toppingsOffered[i]应为PizzaOrder::toppingsOffered[i]
  • 忽略函数PizzaOrder::addTopping(int)的返回值

  • 此行的最后一行无效

    PizzaOrder::PizzaOrder() {
         numToppings = 0;
         size=DEFAULT_SIZE;
         toppings;
    }
    
  • 符号'size'的声明隐藏符号'PizzaOrder :: size',分配给变量'size'的最后一个值未在

    中使用
    PizzaOrder::PizzaOrder(int size) {
       if(!setSize(size))
          size=DEFAULT_SIZE;
    }
    
  • PizzaOrder::addTopping(string topping)PizzaOrder::addTopping(int n)返回值 - 隐式转换为布尔值,

  • if (arraySize == 5)始终评估为True
  • selectedTopping仅由其构造函数或析构函数
  • 引用

还有更多。

最后一个想法:

初始代码看起来像这样

while (outerLoop) {
   string list;
   ...
   while (...) {
     PizzaOrder::getToppings(list);
     ...
   }
   list.clear();
}

getToppings正在添加到列表中,而clear正在清除即将被销毁的字符串。

最好是

while (outerLoop) {
   string list;
   ...
   while (...) {
     list.clear();
     PizzaOrder::getToppings(list);
     ...
   }
}

以便每次清除列表。

但更好的是

  1. make getToppings()返回一个字符串
  2. 将其从列表中提升,因为它没有改变
  3. e.g。

    string list = PizzaOrder::getToppings(list);
    while (outerLoop) {
       ...
       while (...) {        
         ...
       }
    }
    

答案 1 :(得分:0)

因为你的列表变量是一个字符串,我的想法是用空字符串替换该列表。我认为你应该创建自己的函数来清除该列表而不是使用.clear()方法。

阅读此link