ISO C++ 禁止指针和整数之间的比较 [-fpermissive]| [c++]
Posted
技术标签:
【中文标题】ISO C++ 禁止指针和整数之间的比较 [-fpermissive]| [c++]【英文标题】:ISO C++ forbids comparison between pointer and integer [-fpermissive]| [c++] 【发布时间】:2012-02-14 16:57:04 【问题描述】:我正在尝试在 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
来解决这个问题,但我想了解当前的问题。
【问题讨论】:
请注意,'ab'
是一个 int,而 "ab"
是一个字符数组。
这能回答你的问题吗? ISO C++ forbids comparison between pointer and integer [-fpermissive]
【参考方案1】:
char a[2]
定义了一个char
的数组。 a
是指向数组开头内存的指针,使用 ==
实际上不会比较 a
和 'ab'
的内容,因为它们实际上不是相同的类型,'ab'
是整数类型。 'ab'
也应该是 "ab"
否则你也会在这里遇到问题。要比较 char 数组,您需要使用 strcmp。
查看typeid
的'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
表明 '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;
【讨论】:
不太正确(a
是一个数组,正如您在 sizeof(a)
中看到的那样),而不是实际问题。
我想我说过,我认为这里的格式有点混乱。
我以为 char a[13124]; 没有区别和字符串 a;
@İbrahimYazıcı:std::string 实际上是一个包含字符串的类。使用 std::string 的好处包括无需过多担心底层数据的内部表示或内存管理。这样可以更轻松地编写无错误代码,还可以帮助您提高工作效率,因为您不必花太多时间担心平凡的细节。【参考方案2】:
这是由于:
if(a=='ab')
,这里,a
是 const char*
类型(即:char 数组)
'ab'
是一个常量值,它不会被评估为字符串(因为单引号),而是会被评估为整数。
由于char
是从C 继承的基本类型,因此没有定义运算符==
。
好的代码应该是:
if(strcmp(a,"ab")==0)
,然后您将使用 strcmp
将 const char*
与另一个 const char*
进行比较。
【讨论】:
除非存在未定义的行为,否则strcmp( a, "ab" )
不能返回0
。 a
具有 char[2]
类型,因此它可以包含的最长 C 样式字符串是 1 个字符。再多的话,你就会有未定义的行为。
确实,a 应该至少有 3 个字符长才能包含字符串的最终 NUL 字符。但是,存储此 2 个字节数组的编译器对齐可能导致 0 填充相邻的 2 个字节a 变量的内存,从而使代码“工作”,尽管程序员的错误。
我明白了。非常感谢
Padding 可能会为您节省时间。直到用户在输入之前靠在空格键上。输入的第一条规则:期待任何东西,即使它不合理。 (第二个是始终允许前导和尾随空格。人们有时会不小心按空格键,如果它在开头或结尾,他们看不到。)【参考方案3】:
在 DEVC++ 中,我遇到了同样的问题,我得到了解决方案。 我用单引号代替双引号。
【讨论】:
【参考方案4】:在你的代码中,你写了 char a[2];这是错误的。你应该写 char* a[2];然后你就可以得到正确的输出了。
【讨论】:
以上是关于ISO C++ 禁止指针和整数之间的比较 [-fpermissive]| [c++]的主要内容,如果未能解决你的问题,请参考以下文章
Qt错误iso c++禁止指针和整数之间的比较-fpermissive