我一直收到错误消息,说
[错误] ISO C ++禁止比较指针和整数[-fpermissive]
而且不知道如何解决。
我已经搜索了stackoverflow中存在相同问题的人员,但是只想到了这个问题:c++ compile error: ISO C++ forbids comparison between pointer and integer,但并没有回答我的问题。同样让我感到困惑的是,错误出现在HERE注释所指示的在线上,这是if语句,但是在条件部分我看不到任何整数。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int main() {
char in[100];
gets(in);
int len = strlen(in);
std::string s(in);
int count = 0;
for (int i = 0; i < len; i++) {
if (s.at(i) == " ") { // <-- HERE
count += 1;
}
}
cout << count;
}
假设输入为Hello World,我希望输出为1
,但没有得到任何输出。
答案 0 :(得分:4)
表达式" "
是类型为const char [2]
的{{3}}。
表达式string literal返回一个char&
。
因此,s.at(i) == " "
试图找到一个等式运算符
左侧是char&
,右侧是对文字数组const char(&)[4]
的引用。
它为operator==
找到一个或多个候选,但是参数类型不完全匹配,因此接下来尝试s.at(i)
-这是char&
经历{{ 3}}到int
,然后数组衰减到const char*
。
它仍然找不到与之匹配的内容,因此放弃了,但这解释了为什么在发出错误时它具有int
和const char *
参数。
这是说用C ++编写像' '
这样的字符文字的很长的路要走。它们不仅仅是像其他一些语言中那样长度为1的字符串(而且您根本无法编写带有单引号的字符串)。
答案 1 :(得分:2)
更改if语句
if (s.at(i) == ' ') {
count += 1;
}
因为s.at(i)
返回char&," "
是字符串,而' '
是字符。
答案 2 :(得分:0)
问题在于" "
是字符串文字而不是字符!字符文字为' '
。
该错误有点令人误解,因为" "
实际上是const char*
。
答案 3 :(得分:0)
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 ++中的比较不需要相同的类型,但是这些类型必须是 compatible 。指针(字符串文字被认为是指向字符的常量指针,实际上指向文字中的第一个字符)与整数(在您的情况下,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;
}