如何在C ++中用字符串编写switch语句?

时间:2015-02-28 23:49:56

标签: c++

我正在开发一个关于Dev-C ++的小项目。我正在尝试让机器人问你一些问题,但是我不能使用带有字符串的开关状态。每次我尝试这样做都会显示错误!我也尝试将srings更改为普通的int变量,但是当我回答第一个问题后代码一次运行时!有谁知道如何解决这些问题?

这是我的代码:

// #include "stdafx";

#include <iostream>
#include <string>
#include <stdio.h>
#include <string.h>

using namespace std;

int main()
{
    string comida;
    string nome;
    string idade;
    string pais;

    cout << "Ola, o meu nome e Aleksandar. Qual e o teu nome?" << endl; //Ask for nome
    cin >> nome; //Recieve variable nome

    cout << "Es de que pais, " << nome << "?" << endl; //Ask for pais
    cin >> pais; //Receive pais
    cout << pais << " e um pais bonito. " << "Eu sou de Portugal!" << endl; 

    cout << "Quantos anos tens " << nome << "?" << endl; //Ask for idade
    cin >> idade; //Receive variable idade

    switch (idade) {
       case 21:
          cout << "O meu irmao tambem tem 21 anos!" << endl;
          break;
    }
    cout << "Eu tenho 28" << endl;

    cout << "Qual e a tua comida preferida?" << endl; //Ask for comida
    cin >> comida; //Receive variable comida

    cout << "Tambem gosto muito de " << comida << ". Mas gosto mesmo e de Vatruchka!" << endl;
    cout << "Xau " << nome << "!" << endl;
}

4 个答案:

答案 0 :(得分:1)

对于不是整数类型(整数,字符或枚举)的内容,您不能switch,并且case-labels必须是常量值。

您需要将字符串转换为整数类型,或者需要执行if-else-if类型构造。

换句话说:

std::string s;
std::cin >> s;

if (s == "Yes")
{
   std::cout << "You said yes!" << std::endl;
} 
else if (s == "No")
{
   std::cout << "You said no?"  << std::endl;
}
else 
{
   std::cout << "You said something I don't understand"  << std::endl;
}

答案 1 :(得分:1)

您无法使用字符串 - switch仅适用于整数case类型(即整数和枚举)。

你可以使用这样的东西,而不是:

if (idade == "21") { cout << "...\n"; }
else if (idade == "something else") { cout << "...\n"; }

您描述当您更改为使用整数时,代码会立即运行。您可能忘记在每个break条款中包含case

答案 2 :(得分:0)

如果字符串包含数字,switch(std::stoi(idade))将起作用。但如果idade包含其他内容,则无效。

答案 3 :(得分:0)

如果你有一组你期望的不同字符串,那么你可以设置枚举和地图(我在这里松散地使用地图这个词 - 我不是指C ++中的实际地图,虽然我知道可以用它来做类似的事情)

使用此选项将输入转换为枚举,然后您可以在枚举

上运行开关

E.g。

enum class ANSWER
{
    ANSWER_1,
    ANSWER_2
};

class AnswerMap    \\set up this class like a singleton
{
    std::vector<std::pair<std::string, ANSWER>> _answer_map = {
        std::make_pair("Answer 1 string", ANSWER::ANSWER_1),
        std::make_pair("Answer 2 string", ANSWER::ANSWER_2)
    }

    std::string String(ANSWER answer);    \\have this function loop through this->_answer_map until finding the pair with the second item as the given enum and return the corresponding string

    ANSWER Enum(std::string answer);    \\have this function do the same as this->String but find the pair where the string matches and then return the corresponding enum
}