Прошу прощения за простой вопрос, но я не могу понять, почему эта простая программа не работает.
Чем должен быть 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++ есть.
Это отлично работает, потому что они одного типа, но я хочу проверить, не работает ли подстрока, такая как a [0] == b, потому что они разных типов. Итак, что это за тип [0]?
Вы ищете общую подстроку любой длины в строке или пытаетесь быстро найти, находится ли в строке подстрока длиной ровно 1? Второй случай сродни поиску char в строке.
std::string - это строка char, поэтому любой индекс в string будет char.
После просмотра всех ответов у меня возник вопрос: почему, если я определю char c = "a"; a [0] == c; возвращает ошибку, если [0] является символом.
"a" - это не char, это const char *. 'a' - это char (обратите внимание на разные кавычки - двойные и одинарные).
Хорошо, теперь я знаю разницу: a [0] == 'c' (одинарные кавычки имеют значение). Спасибо за помощь!





Вы должны использовать 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, чтобы получить более качественный справочный сайт.
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 ».
Это полезно, но я также пытался определить char c = "a", но a [0] == c также возвращает ошибку (недопустимое преобразование из 'const char *' в 'char' [-fpermissive]), поэтому a [0 ] не символ, как я ожидал.
@ user4581301 Я считаю, что это другое сообщение компилятора; Я указал, что у меня был лязг.
@ jpf137 Au противоположный, a[0]является a char; это c, это не так. Всякий раз, когда вы используете двойные кавычки, вы получаете char *.
@ user4581301 Кроме того, я хотел бы указать, что упомянутая ошибка компилятора имеет неприглядные, хотя и общие характеристики, которые помогают сделать некоторые сообщения компилятора нечитаемыми для новичков: std::__cxx11::string вместо простого string.
Это сообщение об ошибке, представленное спрашивающему, как указано в его вопросе. Я не большой поклонник __cxx11, но не думаю, что int лучше char.
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 Хотя это может быть так, и я согласен с вами, OP, похоже, заинтересован в сравнении строк.
Спасибо, что наконец-то решила эту проблему для меня (в моем коде и в моей голове), a [0] = 'a'. Мне нужно быть более осторожным, чтобы отличать «а» от «а» в будущем.
what is a[0] supposed to be other than "a"?Ну, это мог быть персонаж'a'.