J'ai du code sur lequel j'essaye de travailler ...
#include <iostream>
#include <string>
int main()
{
std::cout << "Hello. Welcome to Delicious Drive Up. What would you like to order?\n";
std::cout << "\nOur menu is-";
std::cout << "...";
std::cout << "\nOrder here > ";
std::string choice;
std::getline(cin, choice);
if (choice == 'hamburger' || choice == 'Hamburger')
{
std::cout << "We don't have any ham. Is a Chickenburger all right? y/n. > ";
std::string opt;
std::getline(cin, opt);
if (opt == 'y' || opt == 'Y' || opt == 'yes' || opt = 'Yes')
{
std::cout << "Here's your chickenburger.";
}
}
}
Ceci a été adapté d'un script Bash que j'ai écrit et est l'un de mes premiers programmes C++. Quand je compile cela, il arrive avec ces erreurs ...
test.cpp:19:15: warning: character constant too long for its type
test.cpp:19:40: warning: character constant too long for its type
test.cpp:23:44: warning: multi-character character constant
test.cpp:23:59: warning: multi-character character constant
test.cpp: In function ‘int main()’:
test.cpp:19: error: no match for ‘operator==’ in ‘choice == 1919378802’
test.cpp:19: error: no match for ‘operator==’ in ‘choice == 1919378802’
test.cpp:23: error: no match for ‘operator==’ in ‘opt == 'y'’
test.cpp:23: error: no match for ‘operator==’ in ‘opt == 'Y'’
test.cpp:23: error: no match for ‘operator==’ in ‘opt == 7955827’
Pourriez-vous expliquer ce que cela signifie et comment les réparer?
EDIT: Je reçois un nouveau message d'erreur maintenant ...
.test.cpp: In function ‘int main()’:
.test.cpp:23: error: no match for ‘operator||’ in ‘((std::operator== [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>](((const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)((const std::basic_string<char, std::char_traits<char>, std::allocator<char> >*)(& opt))), ((const char*)"y")) || std::operator== [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>](((const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)((const std::basic_string<char, std::char_traits<char>, std::allocator<char> >*)(& opt))), ((const char*)"Y"))) || std::operator== [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>](((const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)((const std::basic_string<char, std::char_traits<char>, std::allocator<char> >*)(& opt))), ((const char*)"yes"))) || opt’
.test.cpp:23: note: candidates are: operator||(bool, bool) <built-in>
Comme d'autres l'ont fait remarquer, vous devez utiliser des guillemets ("y"
au lieu de 'y'
) pour vos chaînes, sinon ce sont des littéraux de caractères.
En C/C++, il existe un littéral à plusieurs caractères. sa valeur est un nombre consistant à rassembler les codes de caractères des caractères individuels d'une manière définie par la mise en oeuvre. Vous ne voulez jamais les utiliser à moins d'avoir une très bonne raison. La seule raison pour laquelle vous devez savoir à leur sujet est de comprendre les avertissements et les messages d'erreur:
test.cpp:19: error: no match for ‘operator==’ in ‘choice == 1919378802’
... signifie qu'il n'y a aucun moyen de comparer une chaîne avec le nombre 1919378802, ce que votre compilateur interprète par 'hamburger'
.
Une fois que cela est corrigé, votre nouveau message d'erreur:
.test.cpp:23: error: no match for ‘operator||’ in ...
.test.cpp:23: note: candidates are: operator||(bool, bool) <built-in>
signifie que quelque chose s'est mal passé avec l'un des opérateurs ||
. Peut-être que l'un de ses opérandes n'était pas réellement une expression booléenne. La "note" vous indique qu'il existe un ||
intégré pour deux bool
s, mais qu'il ne peut pas être utilisé dans cette situation.
Solution: Remplacez opt = 'Yes'
par opt == "Yes"
.
L'affectation unique =
, signifie que le résultat de cette expression n'est pas un bool, mais une chaîne, et il n'y a pas de operator||
pour orner un booléen avec une chaîne.
Remarque sur le style: il est généralement considéré comme meilleur de ne pas utiliser une déclaration using namespace std
. À la place, faites explicitement référence aux éléments de la bibliothèque standard (cout
, endl
, string
, getline
) en utilisant un préfixe std::
, comme dans std::string
.
Vous utilisez des guillemets simples pour entourer une chaîne. Vous devez changer
if (choice == 'hamburger' || choice == 'Hamburger')
à
if (choice == "hamburger" || choice == "Hamburger")
La même chose s'applique à 'Yes'
et 'yes'
, bien sûr.
En ce qui concerne le deuxième problème, vous essayez de comparer un seul caractère avec une chaîne. Vous devez également considérer votre 'Y'
comme une chaîne:
if (opt == "y" || opt == "Y" || opt == "yes" || opt == "Yes")
// ^^^ Note the double quotes also on single characters