C ++字符串数组和bools

时间:2015-02-27 16:01:12

标签: c++ arrays string

我目前正在尝试制作一个小食谱应用。我创建了一个包含10个字符串和10个bool的string数组。例如,当我输入Cinnemon时,我想让_Cinnemon为真。我该怎么做?

此外,这是正确写的,还是我可以做得更好?我对编程很陌生。

最后,我该如何解决它,以至于它没有任何说法是小写字母还是大字?

以下是代码:

std::cout << "Welcome, type your ingredients " << std::endl;
std::string ingredients[10]{"Cinnemon", "Milk", "Eggs", "Butter", "Tomatoes", "Salt", "Backing Soda", "Suggar", "Chicken", "Honny"};
bool _cinnemon, _milk, _eggs, _butter, _tomatoes, _salt, _backingSoda, _Suggar, _chicken, _honny;
std::string ingredient;
int i = -1;
while (i = -1) {
    std::cin >> ingredient;
    i++;
    while (i < 9)
    {
        if (ingredient == ingredients[i]){
            std::cout << "Type another if you have any more igredients else type Exit" << std::endl;
            i++;
        } if (ingredient == "Exit" || "exit"){
            return 0;
        } else{
            i++;
        }
    }
} 

3 个答案:

答案 0 :(得分:1)

尝试将硬编码的字符串映射到布尔值。所以你可以轻松地改变它们。

map<string, bool> m;
m["blah"] = false; // Initialize to false
// Later, you can change it by
m["blah"] = true;
// To look up a value, simply do
if(m.count("blah") && m["blah"]) {
  // "blah" is true and do whatever you want to do here
}

对于忽略大小写的字符串比较,您可以编写自己的函数来执行此操作,例如

#include <cctype>  // This is where tolower() is defined
bool stringCmpIgnoreCase(string a, string b) {
  if(a.length() != b.length())
    return false;
  for(int i = 0; i < a.length(); i++)
    if(tolower(a[i]) != tolower(b[i]))
      return false;
  return true;
}

答案 1 :(得分:0)

我知道您正在学习,因此我将避免使用高级数据结构,例如地图和集合,这些数据结构将用于实际应用程序。

我提出的解决方案只使用布尔数组。对于找到字符串的每个indegrients,我将布尔标志设置为相同的索引。以下是它的工作原理:

std::cout << "Welcome, type your ingredients " << std::endl;
const size_t maxind = 10;  // avoid hard coded size !  
std::string ingredients[maxind]{"Cinnemon", "Milk", "Eggs", "Butter", "Tomatoes", "Salt", "Backing Soda", "Suggar", "Chicken", "Honny"};
bool hasindegrient[maxind]{}; // make a table to know which one is present
std::string ingredient;
bool stopit = false;  // exit requested ? 
while (! stopit) {
    std::cin >> ingredient;
    int i;
    for (i=0; i<maxind; i++) 
        if (ingredient == ingredients[i]){
            hasindegrient[i] = true; // <================ set flag of indegrient
            break;
        }
    if (i==maxind) { // here we didn't find it ! 
        if (ingredient == "Exit" || ingredient == "exit")
            stopit = true;
        else  
            std::cout << "Indegrient not found !" << std::endl;
    if (!stopit)
        std::cout << "Type another if you have any more igredients else type Exit" << std::endl;
    }
} 
for (int i=0; i<10; i++)  // display the indegrient list
    if (hasindegrient[i])
        cout << ingredients[i]<< " "; 
cout << endl;

使用这种方法,每个布尔值都是匿名的:每个hasindegrient[i]都是true或false,但没有名称。所以它本身并不意味着什么。但是在此计划中,如果hasindegrient[i]为真,则表示indegrients[i]位于附件中。

如果要在代码解释recipe的内容时添加一些逻辑,可以在开头添加一个为每个索引提供逻辑名称的枚举:

enum {IDG_Cinnemon, IDG_Milk, IDG_Eggs, IDG_Butter, IDG_Tomatoes, IDG_Salt, IDG_Backing_Soda, IDG_Suggar, IDG_Chicken, IDG_Honny };

您可以将此枚举的每个元素理解为常量。如您所见,我遵循的顺序与字符串表中的顺序相同。这允许编写代码,例如:

if (hasindegrient[IDG_Butter]) {
    std::cout << "Take care of your cholesterol" << std::endl;
}  

重要说明:

我认为您应该知道原始代码的一些问题:

    无论i的价值如何,
  • while (i = -1)将永远循环。 =是分配运算符(即-1被复制到i,i的值在条件下被计算)。这是从C / C ++开始时最常见的错误:你当然意味着while (i==-1)这是一个比较。

  • ingredient == "Exit" || "exit"是一种有效的语法。但这种情况总是如此。它绝不意味着&#34; indegrient是退出或退出&#34; 。为此,您需要撰写ingredient == "Exit" || ingredient =="exit"

  • 您的循环结构在搜索中不会成功。特别是如果输入不良者并不遵循预定义的列表...

答案 2 :(得分:0)

此任务有不同的方法。例如,您可以使用bool数组和一个枚举,其中包含可用作数组索引的成分名称。

您可以使用std::bitsetstd::vector<bool>

您可以使用成对数组std::pair<std::string, bool>.

您也可以使用std :: map。

这是一个示范程序

#include <iostream>
#include <map>
#include <string>

int main() 
{
    std::map<std::string, bool> ingredients =
    {
        { "Cinnemon", false }, { "Milk", false }, { "Eggs",false },
        { "Butter", false }, { "Tomatoes", false }, { "Salt", false },
        { "Backing Soda", false }, { "Suggar", false }, { "Chicken", false },
        { "Honny", false }
    };

    std::cout << "Welcome, type your ingredients\n" << std::endl;

    std::string ingredient;
    bool selected = false;

    while ( std::getline(std::cin, ingredient ) )
    {
        if ( ingredient == "Exit" | ingredient == "exit" ) break;

        if ( selected = ( ingredients.count( ingredient ) != 0 ) )
        {
            ingredients[ingredient] = true;
        }
        else
        {
            std::cout << "Invalid ingredient." << std::endl;
        }

        std::cout << "Type another if you have any more igredients else type Exit" << std::endl;
    }

    if ( selected )
    {
        std::cout << "You selected ingredients:"  << std::endl;
        for ( const auto &p : ingredients )
        {
            if ( p.second ) std::cout << p.first << std::endl;
        }
    }

    return 0;
}

考虑到您必须使用函数std::getline而不是operator >>,因为某些成分名称包含多个单词。

此外,您应该进行不区分大小写的搜索。