我正在尝试在Ubuntu(64位)上编译以下代码,Code :: Blocks 10.05作为IDE:
#include <iostream>
using namespace std;
int main() {
char a[2];
cout << "enter ab ";
cin >> a;
if (a == 'ab') // line 7
{
cout << "correct";
}
return 0;
}
在第7行,我的编译器给出了错误“ISO C ++禁止在指针和整数[-fpermissive]之间进行比较。”
为什么这不起作用?我知道我可以使用std::string
解决问题,但我想了解当前的问题。
答案 0 :(得分:14)
char a[2]
定义了一个char
的数组。 a
是指向数组开头的内存的指针,使用==
实际上不会将a
的内容与'ab'
进行比较,因为它们实际上不是相同的类型,'ab'
是整数类型。另外'ab'
应为"ab"
,否则您也会遇到问题。要比较你想要使用strcmp的char数组。
可能具有说明性的一点是查看typeid
的{{1}}:
'ab'
在我的系统上返回:
#include <iostream>
#include <typeinfo>
using namespace std;
int main(){
int some_int =5;
std::cout << typeid('ab').name() << std::endl;
std::cout << typeid(some_int).name() << std::endl;
return 0;
}
显示i
i
实际上被评估为int。
如果你要使用std :: string做同样的事情,那么你将处理一个类,并且std :: string有'ab'
重载,并且在这样调用时会进行比较检查。
如果您希望以惯用的c ++方式将输入与字符串“ab”进行比较,我建议您这样做:
operator ==
答案 1 :(得分:5)
这是由于:
if(a=='ab')
,此处a
为const char*
类型(即:char数组)
'ab'
是一个常量值,不会被计算为字符串(因为单引号),但会被计算为整数。
由于char
是从C继承的原始类型,因此未定义运算符==
。
if(strcmp(a,"ab")==0)
,然后您将使用const char*
将const char*
与另一个strcmp
进行比较。
答案 2 :(得分:0)
在DEVC ++中,我遇到了同样的问题,并且得到了解决方案。 我使用单引号而不是双引号。
答案 3 :(得分:-1)
在您的代码中,您编写了char a [2];这是错误的。您应该写char * a [2];然后您可以获得正确的输出。