1

I'm new to C++.

string str = "WWWHBBB";
if(str[mid] == "H" && str[0] != "W") return; // corrected after comments for second operand

The above line with if condition gives me an error.

Comparison between pointer and integer ('std::__1::basic_string, std::__1::allocator >::value_type' (aka 'char') and 'const char *')

I have searched the internet enough to know that array style access is fine in strings. Error basically is pointing out comparison about pointer and integer. Really? I thought I was comparing character H to another character in string str.

I tried if str[mid] really returns an iterator I should do *str[mid]. Nah! Didn't work either.

marc_s
  • 704,970
  • 168
  • 1,303
  • 1,425
HalfWebDev
  • 6,187
  • 12
  • 60
  • 92

2 Answers2

3

You'd want to compare with a single char

if (str[mid] == 'H' && str[mid] != 'W') return;

Note that double-quotes in this case refer to a const char[] whereas single-quotes refer to a single char.

The warning is telling you that the only way to make those comparisons in your case would be to compare the lhs char (result of str[mid]) to the rhs would be to let the array decay to const char* and compare the pointer address to the char.

Cory Kramer
  • 107,498
  • 14
  • 145
  • 201
3

In the expression of the if statement

 if(str[mid] == "H" && str[mid] != "W") return;

the string literals "H" and "W" that have the type const char[2] are implicitly converted to pointers to their first characters of the type const char *.

So you are trying to compare a character returned by the expression str[mid] with a pointer.

Instead of the string literals you need to use character literals like to compare characters

 if(str[mid] == 'H' && str[mid] != 'W') return;

You could also write like

 if(str[mid] == *"H" && str[mid] != *"W") return;

or

 if(str[mid] == "H"[0] && str[mid] != "W"[0]) return;

dereferencing the pointers but this will be confusing

Pay attention to that if str[mid] == 'H' then the second operand will always yield true. So it is enough to write

 if( str[mid] == 'H' ) return;
Vlad from Moscow
  • 265,791
  • 20
  • 170
  • 303