C ++ различает строки символов и отдельные символы в литералах по различным символам в кавычках ("
против '
). " "
в вашем коде - это строковый литерал, который содержит один пробел , один символ пробела будет записан как ' '
. Функция std::string::at
возвращает один символ.
Небольшой пример покажет вам, как выглядит компилятор на этом
#include <iostream>
#include <string>
#include <typeinfo> // for typeid
using namespace std;
int main() {
string s = "Hello, world!";
cout << typeid(" ").name() << endl;
cout << typeid(' ').name() << endl;
cout << typeid(s.at(0)).name() << endl;
return 0;
}
см. онлайн-демонстрацию вышеуказанного кода .
Но, если быть точным, идентичные типы не требуются для сравнения в C ++, но типы должны быть совместимыми . Указатели (строковые литералы считаются постоянными указателями на символы, фактически указывающие на первый символ в литерале) и целые числа (к которым в вашем случае повышен char
) не совместимы . Чтобы быстро «исправить» вашу проблему, измените s.at(i) == " "
на s.at(i) == ' '
, но ваша программа останется проблематичной: она по-прежнему содержит много кода C, который сам по себе проблематичен. Возможная версия C ++ может быть такой:
#include <iostream>
#include <string>
using namespace std;
int main() {
int count = 0;
string line;
std::getline(cin, line);
for (const auto c: line) {
if (c == ' ') {
count++;
}
}
cout << "Your input \""<< line << "\" contains " << count << " space(s)." << endl;
return 0;
}