Tengo algunos problemas para usar una declaración de switch con la entrada del usuario. ¿Alguien puede explicar qué está pasando? Lo siento si esta es una pregunta de novato, ya que estoy muy acostumbrado a Python y recién comencé a aprender C++.
#include <iostream> #include <string> using namespace std; #include <cstdlib> int main() { string name; cout << "Enter a name: "; cin >> name; switch (name){ case name == "Seth": std::cout << "That's my name!"; return 0; break; case name == "seth": std::cout << "Wow, you couldnt even put correct capitalization on my name...\n"; std::cout << "LEARN YOUR PRONOUNS AND GO BACK TO SCHOOL!"; return 0; break; case name == "SETH": std::cout << "Ok ok you spelled my name right but make sure you turn off caps lock please"; return 0; break; default: std::cout << "Come on get my name RIGHT!!!\n"; std::cout << "But you entered " << name; } return 0; }Según el estándar C++ 17 (9.4.2 La sentencia switch)
2 La condición será de tipo integral, tipo de enumeración o tipo de clase. Si es de tipo clase, la condición se convierte contextualmente implícitamente (Cláusula 7) a un tipo integral o de enumeración. Si el tipo (posiblemente convertido) está sujeto a promociones integrales (7.6), la condición se convierte al tipo promocionado. Cualquier declaración dentro de la declaración de cambio se puede etiquetar con una o más etiquetas de caso de la siguiente manera: expresión-constante de caso: donde la expresión-constante será una expresión constante convertida (8.20) del tipo ajustado de la condición de cambio. Dos de las constantes de caso en el mismo interruptor no tendrán el mismo valor después de la conversión.
La clase std::string no tiene un operador de conversión implícito que convierta un objeto del tipo std::string en un tipo integral o de enumeración.
Así que la expresión en esta declaración de cambio
switch (name){es inválido.
También etiquetas de casos como esta
case name == "seth":son sintácticamente incorrectos.
Podría resolver su problema con la declaración de cambio, por ejemplo, de la siguiente manera
#include <iostream> #include <string> #include <array> #include <iterator> #include <algorithm> int main() { std::array<const char *, 3> names = { "Seth", "seth", "SETH" }; std::string name; std::cout << "Enter a name: "; std::cin >> name; size_t n = std::find( std::begin( names ), std::end( names ), name ) - std::begin( names ); switch (n) { case 0: std::cout << "That's my name!"; break; case 1: std::cout << "Wow, you couldnt even put correct capitalization on my name...\n"; std::cout << "LEARN YOUR PRONOUNS AND GO BACK TO SCHOOL!"; break; case 2: std::cout << "Ok ok you spelled my name right but make sure you turn off caps lock please"; break; default: std::cout << "Come on get my name RIGHT!!!\n"; std::cout << "But you entered " << name; break; } }#include <iostream> #include <string> int main() { std::string name; std::cout << "Enter a name: "; std::cin >> name; if(name == "Seth") { std::cout << "That's my name!" << std::endl; } else if(name == "seth") { std::cout << "Wow, you couldn't even put correct capitalization on my name..." << std::endl; std::cout << "LEARN YOUR PRONOUNS AND GO BACK TO SCHOOL!" << std::endl; } else if(name == "SETH") { std::cout << "Ok ok you spelled my name right but make sure you turn off caps lock please" << std::endl; } else { std::cout << "Come on get my name RIGHT!!!" << std::endl; std::cout << "But you entered " << name << std::endl; } return 0; }Como otras personas han dicho que no puede hacer una comparación de cadenas en el switch y proporcionó una solución. Pero me gustaría usar enum class que encontré más legible y la comparación int mucho más rápida que la comparación de string .
#include <algorithm> #include <iostream> #include <iterator> #include <string> #include <unordered_map> int main() { enum class Spellings { Seth, seth, SETH }; const std::unordered_map<std::string, Spellings> spellings_map{ {"Seth", Spellings::Seth}, {"seth", Spellings::seth}, {"Seth", Spellings::SETH}, }; std::string name; std::cout << "Enter a name: "; std::cin >> name; auto result = spellings_map.find(name); if (result == spellings_map.end()) { std::cout << "Come on get my name RIGHT!!!\n"; std::cout << "But you entered " << name; return -1; } switch (result->second) { case Spellings::Seth: std::cout << "That's my name!"; break; case Spellings::seth: std::cout << "Wow, you couldnt even put correct capitalization on " "my name...\n"; std::cout << "LEARN YOUR PRONOUNS AND GO BACK TO SCHOOL!"; break; case Spellings::SETH: std::cout << "Ok ok you spelled my name right but make sure you " "turn off caps lock please"; break; } }