Сравнение элемента в строке со строкой длиной 1 в C++

Прошу прощения за простой вопрос, но я не могу понять, почему эта простая программа не работает.

Чем должен быть a[0], кроме "a"?

#include <iostream>

using namespace std;

int main(){

    string a = "abcd";
    string b = "a";


    if (a[0]==b){//<------problem here
        cout << a << endl;
    }

    return 0;
}

который возвращает ошибку

no match for ‘operator==’ (operand types are ‘char’ and ‘std::__cxx11::string {aka std::__cxx11::basic_string<char>}’)

или просто использование string c=a[0]; возвращает ошибку:

conversion from ‘char’ to non-scalar type ‘std::__cxx11::string {aka std::__cxx11::basic_string<char>}’ requested

PS: попробовав несколько вещей, я могу заставить его работать, если я сравню a[0]==b[0] или назначу c[0]=a[0], потому что теперь они определенно одного типа, но я все же хотел бы знать, какой стандартный и / или самый быстрый способ провести сравнение подстроки с другой строкой в ​​C++ есть.

what is a[0] supposed to be other than "a"? Ну, это мог быть персонаж 'a'.
jdc 18.06.2018 21:40

Это отлично работает, потому что они одного типа, но я хочу проверить, не работает ли подстрока, такая как a [0] == b, потому что они разных типов. Итак, что это за тип [0]?

jpf137 18.06.2018 21:43

Вы ищете общую подстроку любой длины в строке или пытаетесь быстро найти, находится ли в строке подстрока длиной ровно 1? Второй случай сродни поиску char в строке.

chux - Reinstate Monica 18.06.2018 21:54

std::string - это строка char, поэтому любой индекс в string будет char.

user4581301 18.06.2018 21:54

После просмотра всех ответов у меня возник вопрос: почему, если я определю char c = "a"; a [0] == c; возвращает ошибку, если [0] является символом.

jpf137 18.06.2018 22:02
"a" - это не char, это const char *. 'a' - это char (обратите внимание на разные кавычки - двойные и одинарные).
Jesper Juhl 18.06.2018 22:07

Хорошо, теперь я знаю разницу: a [0] == 'c' (одинарные кавычки имеют значение). Спасибо за помощь!

jpf137 18.06.2018 22:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
704
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы должны использовать std :: строка :: найти для поиска подстрок. Использование оператора нижнего индекса в строке возвращает один символ (скаляр), а не строку (вектор, не скаляр); следовательно, они не относятся к одному и тому же типу, и нет определенного сравнения.

Вы также можете использовать std :: string :: substr для выбора подстроки, которую вы можете напрямую сравнить с другой строкой.

Пример

#include <iostream>
#include <string>

int
main() {
    std::string a = "abcd";
    std::string b = "a";
    if (a.find(b) != std::string::npos) {
        std::cout << a << "\n";
    }
    if (a.substr(0, 1) == b) {
        std::cout << a << "\n";
    }
    return 0;
}

Рекомендации

http://en.cppreference.com/w/cpp/string/basic_string/find
http://en.cppreference.com/w/cpp/string/basic_string/substr
http://en.cppreference.com/w/cpp/string/basic_string

Возможно также упомянуть std :: string :: substr, а также тот факт, что "foo" относится к типу const char * (указатель на завершающуюся строку \0), тогда как 'f' имеет тип char (односимвольный). Кроме того, я лично рекомендовал бы ссылаться на cppreference.com, а не на cplusplus.com, чтобы получить более качественный справочный сайт.

Jesper Juhl 18.06.2018 22:02

a[0] - это символ, имеющий значение 'a', тогда как b - это строка другого типа. Это будет работать, если определен operator ==(char, string) (или какой-либо вариант с const и / или ref), но его нет, по крайней мере, в стандарте C++, поэтому компиляция должен завершится ошибкой. Компилятор clang даже дает полезное сообщение:

invalid operands to binary expression ('int' and 'string'...

что означает, что вы сравниваете разные типы.

Попробуйте изменить его, чтобы сравнить a[0] и b[0]. Оператор скобок определен для строк и возвращает символ, так что вы можете сравнить их таким образом.

редактировать: Может показаться, что он не отвечает на вопрос. Это делает ответ на исходный вопрос; OP изменил весь вопрос после факта (и кто-то добавил соответствующий ответ), но исходный вопрос все еще присутствует в первом абзаце. Удаляю ответ, если модераторы захотят.

Я бы назвал полученное сообщение об ошибке немного более прямым: «Типы операндов -« char »и« std :: __ cxx11 :: string ».

user4581301 18.06.2018 21:51

Это полезно, но я также пытался определить char c = "a", но a [0] == c также возвращает ошибку (недопустимое преобразование из 'const char *' в 'char' [-fpermissive]), поэтому a [0 ] не символ, как я ожидал.

jpf137 18.06.2018 21:54

@ user4581301 Я считаю, что это другое сообщение компилятора; Я указал, что у меня был лязг.

John Perry 18.06.2018 21:57

@ jpf137 Au противоположный, a[0]является a char; это c, это не так. Всякий раз, когда вы используете двойные кавычки, вы получаете char *.

John Perry 18.06.2018 21:58

@ user4581301 Кроме того, я хотел бы указать, что упомянутая ошибка компилятора имеет неприглядные, хотя и общие характеристики, которые помогают сделать некоторые сообщения компилятора нечитаемыми для новичков: std::__cxx11::string вместо простого string.

John Perry 18.06.2018 21:59

Это сообщение об ошибке, представленное спрашивающему, как указано в его вопросе. Я не большой поклонник __cxx11, но не думаю, что int лучше char.

user4581301 18.06.2018 22:41
Ответ принят как подходящий

what is a[0] supposed to be other than "a"?

Это 'a', а не "a", и это char. Вы не можете сравнивать char с string, потому что это разные типы. Но вы можете извлечь из строки подстроку длиной в 1 символ:

if (a.substr(0,1)==b)...

Затем вы будете сравнивать "a" с "a", потому что .substr возвращает string, а не char, даже если длина равна 1.

Также не забудьте #include <string>, если вы работаете с std::string.

Немного перебор. a[0] == b[0] был бы более прямым. Однако золотым стандартом, вероятно, было бы преобразование b в char.

user4581301 18.06.2018 21:53

@ user4581301 Хотя это может быть так, и я согласен с вами, OP, похоже, заинтересован в сравнении строк.

Killzone Kid 18.06.2018 21:55

Спасибо, что наконец-то решила эту проблему для меня (в моем коде и в моей голове), a [0] = 'a'. Мне нужно быть более осторожным, чтобы отличать «а» от «а» в будущем.

jpf137 18.06.2018 22:06

Другие вопросы по теме