Сравнение указателя и целого числа в строковом классе - C ++

Я новичок в C ++.

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

Приведенная выше строка с условием if выдает ошибку.

Сравнение указателя и целого числа ('std :: __ 1 :: basic_string, std :: __ 1 :: allocator> :: value_type' (aka 'char') и 'const char *')

Я достаточно искал в Интернете, чтобы знать, что доступ к стилю массива подходит для строк. Ошибка в основном указывает на сравнение указателя и целого числа. Действительно? Я думал, что сравниваю символ H с другим символом в строке str.

Я пробовал, если str[mid] действительно возвращает итератор, я должен сделать *str[mid]. Неа! Тоже не сработало.


person HalfWebDev    schedule 31.03.2020    source источник
comment
Двойные кавычки означают, что это c-строка (const char*), если вам нужен символьный литерал, используйте одинарные кавычки.   -  person flowit    schedule 31.03.2020
comment
C ++ - это не JavaScript. Типы цитат, которые вы используете, имеют значение.   -  person PaulMcKenzie    schedule 31.03.2020
comment
Попался ... Обучение на лету и написание программ. Пожалуйста, люби меня за это.   -  person HalfWebDev    schedule 31.03.2020
comment
Одиночные кавычки для одиночных символов. Двойные кавычки для текста.   -  person Thomas Matthews    schedule 31.03.2020


Ответы (2)


В выражении оператора if

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

строковые литералы «H» и «W», имеющие тип const char[2], неявно преобразуются в указатели на их первые символы типа const char *.

Итак, вы пытаетесь сравнить символ, возвращаемый выражением str[mid], с указателем.

Вместо строковых литералов вам нужно использовать символьные литералы, например, для сравнения символов.

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

Вы также можете написать как

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

or

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

разыменование указателей, но это сбивает с толку

Обратите внимание, что если str[mid] == 'H', то второй операнд всегда будет возвращать истину. Так что достаточно написать

 if( str[mid] == 'H' ) return;
person Vlad from Moscow    schedule 31.03.2020
comment
Как 'H' != 'W', мы могли бы даже просто написать if (str[mid] == 'H') return;. - person Jarod42; 31.03.2020
comment
@ Jarod42 Хорошее замечание. Даже условие не просматривал. :) - person Vlad from Moscow; 31.03.2020
comment
Привет, Влад, все хорошо, но я не понимал, почему для LHS написано целое число, а не символ. @ Jarod42 второй операнд должен был быть str [0]. Благодарность :) - person HalfWebDev; 31.03.2020
comment
@kushalvm Тип char относится к стандартным целочисленным типам. - person Vlad from Moscow; 31.03.2020
comment
Ой! Я полагаю, что сначала мне нужно закончить это формальное чтение по языку. Грасиас! - person HalfWebDev; 31.03.2020

Вы бы хотели сравнить с одним char

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

Обратите внимание, что двойные кавычки в этом случае относятся к const char[], тогда как одинарные кавычки относятся к одиночному char.

Предупреждение сообщает вам, что единственный способ провести эти сравнения в вашем случае - это сравнить lhs char (результат str[mid]) с rhs, это позволить массиву распасться до const char* и сравнить адрес указателя с char.

person Cory Kramer    schedule 31.03.2020
comment
Не могли бы вы указать мне на хороший, но полноценный учебник / справочник по C ++? - person HalfWebDev; 31.03.2020
comment
@kushalvm stackoverflow.com/questions / 388242 / - person Cory Kramer; 31.03.2020