0

In my textbook is a function called streq that checks to see if a string is equal. I copied this code and decided to add cout << *s1 << endl; to see what it is printing out before returning false. However, what I notice is that if both input strings are equal and I have the extra code I added, it will return false.

#include <iostream>
using namespace std;

bool streq(const char* s1, const char* s2);

int main()
{
    const char A [] = "Hello";
    const char B [] = "Hello";

    cout << streq(A,B) << endl;
}

bool streq(const char* s1, const char* s2)
{    
    int count = 0;

    while (*s1 != 0 && *s2 != 0)
        if (*s1++ != *s2++)
            cout << *s1 <<  endl;
            return false;
        count++;
    return (*s1 == *s2);
}

However, if I comment out the code I added, the function will work properly and return true (1). Does anyone know what the issue is here?

1 Answer 1

6

Despite your indentation, this code

if (*s1++ != *s2++)
    cout << *s1 <<  endl;
    return false;

is equivalent to:

if (*s1++ != *s2++)
{
    cout << *s1 <<  endl;
}
return false;

That's why your modification changed the logic of the program. if condition controls the next statement, one statement only. You need to use a block if you need multiple statement.

if (*s1++ != *s2++)
{
    cout << *s1 <<  endl;
    return false;
}

This is exactly why some people choose to always use a block with if and else, even when there's only one statement follows. It's less error-prone when you need to add more statement later.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.