views:

174

answers:

5

I have the following code that works correctly. However after I add an else statement anything always evaluates to else

wgetstr(inputWin, ch); //get line and store in ch variable
     str = ch;        //make input from char* to string


     if(str=="m" || str=="M"){
      showFeedback("Data Memory Updated");
     }
     if(str=="p" || str=="P"){
      showFeedback("Program Memory Updated");
     }
     if(str=="g" || str=="G"){
      showFeedback("Accumulator, Program Counter, Zero Result Updated");
     }
     if(str=="e" || str=="E"){
      showFeedback("Editing Mode Enabled");
     }
     if(str=="c" || str=="C"){
      showFeedback("Program Copied Into Program Memory");
     }
     if(str=="r" || str=="R"){
      showFeedback("Executing Program");
     }
     if(str=="x" || str=="X"){
      showFeedback("Program Exited");
     }

All the previous evaluates correctly based on what the input is. i.e If I enter "m" it calls the showeFeedback("Data Memory Updated") on so on, but if I add the following else statement, I always get "Invalid Command Entered" no matter what I enter.

else{
      showFeedback("Invalid Command Entered");
     }
+5  A: 

You need to use else if for everything except the first one.

So the simple change to your existing code:

     if(str=="m" || str=="M"){
      showFeedback("Data Memory Updated");
     }
     else if(str=="p" || str=="P"){
      showFeedback("Program Memory Updated");
     }
     else if(str=="g" || str=="G"){
      showFeedback("Accumulator, Program Counter, Zero Result Updated");
     }
     else if(str=="e" || str=="E"){
      showFeedback("Editing Mode Enabled");
     }
     else if(str=="c" || str=="C"){
      showFeedback("Program Copied Into Program Memory");
     }
     else if(str=="r" || str=="R"){
      showFeedback("Executing Program");
     }
     else if(str=="x" || str=="X"){
      showFeedback("Program Exited");
     }
     else
     {
      showFeedback("Invalid Command Entered");
     }
Brian R. Bondy
+9  A: 

All of those are separate if-statements. The else you added only goes with the last one. Change all but the first if to else if and it should work like you expect.

Kristo
you're so right. I don't know how I did this. I'm not that noob. Thanks.
+1  A: 

Because when you add the else, its against the if(str=="x" || str=="X") line - so anything that is not an X will hit the else statement.

I think what you want are to convert all those ifs to "else if", except the first one of course.

cyberconte
+3  A: 

Another approach would be to use the switch statement that exists exactly for this kind of needs..

eg:

char str = ch[0];

switch (str)
{
    case 'm':
    case 'M': { showFeedback("Data Memory Updated"); break; }
    case 'p':
    case 'P': { showFeedback("Program Memory Updated"); break; }
    ....
    default: { showFeedback("Invalid Command Entered"); }
    /* default case is choosen if noone of the above is selected */
}

EDIT: just to explain your doubt in the comment, char str = ch[0] means take first character of the string and put it here.

if you want to check the complete string doing direct comparisons (with == or !=) is not adeguate: you should use strcmp(char* str1, char* str2) function that returns 0 if the two strings are equal.

Jack
yes i tried that but if i enter something like "mem" it will call case 'm' for some reason
"some reason" is that checking just first character of a string won't assume anything about the rest.. so "m" or "mem" or "mwhatever" will be just the same. It's a sort of *if string begins with 'm' character*
Jack
switch does not work for strings
J-16 SDiZ
my snippet is not working on strings, actually.And as you can see there is "char str", next time before downvoting please try to get into the problem.
Jack
Btw, this is C++, and I think the questioner's `str` is probably a string class, since the comment "make input from char* to string" suggests to me that "char*" and "string" are different things. So `==` and `!=` should be adequate. I agree with the rest of this, though, switching on a char is the obvious thing since all commands a single-char. Could add a check that the input isn't longer than one char: your code processes "go" the same as "g", while the questioner's code rejects "go" as invalid.
Steve Jessop
A: 

One thing to note, you may want to use toupper to convert your string to uppercase so that you don't have to OR it with lowercase guesses, might make it a little faster.

adam_0