c ++解决指针和整数之间的比较

时间:2013-04-20 01:27:58

标签: c++

do {
    getline (myfile,temp);
    if (temp[0] != "="){
        MyAlbums[i].tracks.push_back(temp);

    }
    else {
        break;
    }
}while(true);

给了我这个错误:

ISO C ++禁止指针和整数[-fpermissive]

之间的比较

我试图循环文本文件中的行和'push_pack',如果该行不以“=”等于字符开头。否则我想摆脱循环。

任何帮助都非常适用!

2 个答案:

答案 0 :(得分:6)

if (temp[0] != "="){

应该是

if (temp[0] != '='){

原因是temp[0]的类型为char(假设temp是您读入的字符串),您应该将它与字符'='进行比较而不是字符串文字"="。我假设您已成功阅读temp,因此如果不是这样,您可能需要检查一下。

编辑(感谢Adam Liss)

字符串文字(如"=")属于(const char *)类型,它们用双引号括起来;单个字符用单引号括起来。因此,您有关于将char(字面值为整数)与const char *进行比较的编译抱怨消息。

从这里引用:IBM C++ documentation

C  A character literal has type int.
C++ A character literal that contains only one character has type char, 
which is an integral type.

答案 1 :(得分:1)

首先,确保getline成功。在bool ean上下文中对其进行评估,以确定结果:

while (getline(myfile, temp)) {
  /* code goes here */
}

而不是

do {
  getline(myfile, temp);
  /* code goes here */
} while (true);

永远不要在没有检查它是否立即失败的情况下进行输入,否则你将会遇到非常烦人的错误。

其次,确保temp长度至少为1个字符。如果temp.size() >= 1安全,true将为temp[0]。如果getline曾为您提供长度为0的string,则对其执行temp[0]将导致未定义的行为。未定义的行为对于追踪非常烦人,因为在某种情况下它可能表现得完全无害,然后在一个意想不到的地方咬你。

第三,做temp[0] != '='而不是temp[0] != "="'='是一个字符,"="是2个字符的缓冲区,第一个是'=',第二个是'\0'。当您尝试执行"="时,由!=表示的两个字符的数组被隐式转换为指向第一个字符的指针,然后生成错误(因为它不知道如何将指针与角色的角色。)