2017-07-20 1 views
-3

Ich versuche, ein einfaches Mad Libs Programm in C++ zu machen, und ich möchte überprüfen, ob ein Wort, das ein Benutzer eingegeben hat, mit einem Vokal beginnt, und falls ja, ändern Sie das "a" vor dem Wort, zu einem "an". Ich konnte das erste gespeicherte Zeichen abrufen, es wird jedoch nicht mit den anderen Zeichen in der If-Anweisung verglichen. Mache ich das völlig falsch?Ich kann keine Zeichen vergleichen (C++)

#include <string> 
#include <iostream> 
using namespace std; 

int main() { 
    string adj_3; 
    string anN; 
     char firstChar; 

//  GETTING USER'S WORD 

     cout << "ADJECTIVE: " << endl; 
     getline(cin, adj_3); 

//  GETTING FIRST CHARACTER 

     firstChar = adj_3[0]; 

//  SEEING IF IT'S A VOWEL (not working) 

     if(firstChar == ('a' || 'e' || 'i' || 'o' || 'u' || 'A' || 'E' || 'I' || 'O' || 'U')) { 
      anN = "n"; 
     } 
     else { 
      cout << "not working" << endl; 
     } 

    cout << "I am having a" << anN << " " << adj_3 << " time at camp." << endl; 

} 
+2

Sie könnten ein [gutes Buch] lesen wollen (https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). – Rakete1111

+4

Klingt, als könnten Sie ein [gutes C++ Buch] verwenden (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). Darin wird Ihnen gezeigt, wie man mehrere Vergleiche macht. – NathanOliver

+1

Das ist nicht wie Operator || funktioniert. – Borgleader

Antwort

3

|| Der Bediener braucht zwei Argumente angewendet werden, etwa so:

if (firstChar == 'a' || firstChar == 'e' || firstChar == 'i' || ...) 

firstChar == 'a' auf einen booleschen auswertet. firstChar == 'a' || firstChar == 'e' nimmt die zwei booleschen Werte, die sich aus diesen beiden Operationen ergeben, und gibt einen anderen booleschen Wert zurück, der dann in die nächste || Operation als erstes Argument eingegeben wird. Auf diese Weise können Sie die || Operationen "verketten", bis einer von ihnen wahr ist, oder bis sie alle falsch sind.

Beispiele und Erläuterungen finden Sie unter here.

1

hnefatl 's Antwort ist eine Möglichkeit.

Sie können auch den Schalter case ohne break-Anweisungen verwenden, um den Vokal zu überprüfen. Etwas wie:

switch(firstChar) 
{ 
case 'a': 
case 'e': 
case 'i': 
case 'o': 
case 'u': 
case 'A': 
case 'E': 
case 'I': 
case 'O': 
case 'U': cout<<"Vowel"; 
} 

Hinzu kommt, dass switch-case haben viele Vorteile gegenüber if-else ladder wie hier https://stackoverflow.com/a/1028463/6594779 angegeben.

1

Logischer Operator || kombiniert zwei boolesche Ausdrücke, z. a==0 || b==1, und gibt True zurück, wenn einer der beiden Operanden true ist. Wenn Sie ein einzelnes Zeichen wie 'a' als Operanden übergeben, wird dies als true interpretiert, da der Wert 'a'97 und 97 != 0 => true ist. Daher ist Ihr Ausdruck ('a' || 'e' || 'i' || 'o' || 'u' || 'A' || 'E' || 'I' || 'O' || 'U') immer true, und firstchar == (....) ist dasselbe wie firstchar == true, was wahrscheinlich false ergeben wird.

Man könnte schreiben ...

if (firstChar == 'a' || firstChar == 'e' || firstChar == 'i' || ...) 

oder ...

if (strchr(firstChar, "aeiouAEIOU") != NULL)) ... 
0

Sie auch ein Array verwenden können, wobei Sie die Vokale alle speichern und dann vergleichen. So etwas wie unten gezeigt:

char vowels[10]={'a','e','i','o','u','A','E','I','O','U'}; 
    int flag=0; 
    for(int i=0;i<10;i++) 
    { 
     if(vowels[i]==firstChar) 
     { 
      flag=1; 
      anN="n"; 
     } 
    } 
    if(flag==1) 
     cout << "I am having a" << anN << " " << adj_3 << " time at camp." << endl; 
    else 
     cout << "not working" << endl; 
Verwandte Themen