English 中文(简体)
C++ String manipulation - if stament
原标题:

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");
        }
最佳回答

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.

问题回答

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");
        }

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.

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.

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.





相关问题
Simple JAVA: Password Verifier problem

I have a simple problem that says: A password for xyz corporation is supposed to be 6 characters long and made up of a combination of letters and digits. Write a program fragment to read in a string ...

Case insensitive comparison of strings in shell script

The == operator is used to compare two strings in shell script. However, I want to compare two strings ignoring case, how can it be done? Is there any standard command for this?

Trying to split by two delimiters and it doesn t work - C

I wrote below code to readin line by line from stdin ex. city=Boston;city=New York;city=Chicago and then split each line by ; delimiter and print each record. Then in yet another loop I try to ...

String initialization with pair of iterators

I m trying to initialize string with iterators and something like this works: ifstream fin("tmp.txt"); istream_iterator<char> in_i(fin), eos; //here eos is 1 over the end string s(in_i, ...

break a string in parts

I have a string "pc1|pc2|pc3|" I want to get each word on different line like: pc1 pc2 pc3 I need to do this in C#... any suggestions??

Quick padding of a string in Delphi

I was trying to speed up a certain routine in an application, and my profiler, AQTime, identified one method in particular as a bottleneck. The method has been with us for years, and is part of a "...

热门标签