ISO C++禁止指针和整数之间的比较[-fpermissive] | [c++]

23

我试图在Ubuntu (64-bit)操作系统下使用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++ forbids comparison between pointer and integer [-fpermissive]"。

为什么这个不起作用?我知道我可以使用 std::string 来解决这个问题,但我想了解当前的问题。


6
请注意,'ab' 是一个整数,而 "ab" 是由字符组成的数组。 - avakar
这个回答解决了您的问题吗?ISO C++禁止指针和整数之间的比较[-fpermissive] - S.S. Anne
4个回答

18

char a[2]定义了一个char类型的数组。 a是指向数组开头内存的指针,使用==并不会比较a'ab'的内容,因为它们实际上不是相同的类型,'ab'是整数类型。同时,'ab'应该改成"ab",否则在这里也会出现问题。如果要比较char数组,应该使用strcmp

有一件可能有用的事情是查看'ab'typeid

#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
展示了'ab'实际上被评估为int类型。
如果您在std::string中执行相同的操作,则将处理一个类,并且std::string已经重载了operator ==,并且在以这种方式调用时将进行比较检查。
如果您希望以C++习惯用法比较输入与字符串"ab",我建议您这样做:
#include <iostream>
#include <string>
using namespace std;
int main(){
    string a;
    cout<<"enter ab ";
    cin>>a;
    if(a=="ab"){
         cout<<"correct";
    }
    return 0;
}

1
不太正确(a 是一个数组,你可以通过 sizeof(a) 看到),也不是实际的问题。 - David Thornley
我想我说过了,我认为这里的格式有点混乱。 - shuttle87
我曾认为char a[13124];和string a;之间没有区别。 - Thunfische
@İbrahimYazıcı:std::string实际上是一个包含字符串的类。使用std::string的好处包括不需要过多关注底层数据的内部表示或内存管理。这使得编写无误代码更容易,也有助于提高生产力,因为您不必花费太多时间担心琐碎的细节。 - shuttle87

12
这是由于以下原因导致的:
if(a=='ab')语句中,aconst char*类型(即:字符数组)。 'ab'是一个常量值,由于使用了单引号,它不会被当作字符串进行评估,而是将其作为整数进行评估。
由于char是从C继承过来的原始类型,没有定义运算符==
正确的代码应该是:if(strcmp(a,"ab")==0),这样你就可以使用strcmp函数比较一个const char*和另一个const char*

5
除非出现未定义行为,否则strcmp( a, "ab" )不可能返回0。变量a的类型是char[2],因此它所能容纳的最长C风格字符串只有一个字符。如果超过一个字符,就会产生未定义行为。 - James Kanze
实际上,a 应至少为 3 个字符长才能容纳字符串的最终 NUL 字符。然而,编译器对于存储这个 2 字节数组的对齐方式可能会导致 a 变量相邻的 2 字节内存被填充为 0,从而使代码“工作”,尽管程序员存在错误。 - dweeves
填充可能会在这里帮助你。直到用户在输入之前按下空格键。输入的第一条规则:期望任何东西,即使不合理。(第二条规则是始终允许前导和尾随空格。人们有时会意外地按下空格键,如果它在开头或结尾,他们就看不到它。) - James Kanze

5
在DEVC++中,我遇到了相同的问题并找到了解决方案。我使用单引号代替双引号。

-2
在你的代码中,你写了 char a[2]; 这是错误的。你应该写 char* a[2]; 然后你就可以得到正确的输出。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接