【问题标题】:Comparison between pointer and integer C++ forbidden指针和整数的比较 C++ 禁止
【发布时间】:2020-05-10 08:10:26
【问题描述】:

嘿,我还在学习 C++,在编译这部分代码时遇到了麻烦。在进一步研究我正在为项目开发的文本游戏之前,我想知道为什么在尝试编译时会出现此错误,以便在开发时进行调试。

ISO C++ 禁止指针和整数之间的比较 [-fpermissive] if (answer1 == 'Yes' && answer1 == 'yes) {

我不确定我哪里出错了,因为代码将结果存储为“是”。 (我通过添加 std::cout >> answer1; 在收集用户 y/n 答案后进行检查。)

但是当我尝试使用 If 语句检查时,我得到了这个错误。

    #include <iostream>

int main() {

  char name[50];
  char answer1[50];

  std::cout << "Ahh... Welcome newcomer. What is your name?\n";
  std::cin >> name;
  std::cout << "You said your name was " << name << " correct?\n";
  std::cin >> answer1;

    // Let the game begin!

  if (answer1 == 'Yes' && answer1 == 'yes') {

    std::cout << "Lets get this game started then!\n";

  }
  else {

    std::cout << "Then why are you even wasting my time?\n";
  }

}

我知道这是基本的和初级的,但我仍在学习(也是自学的)。感谢阅读。

【问题讨论】:

  • 为什么在 C++ 中使用 C 字符串?你真的应该使用字符串
  • 附带说明,因为nameanswer1char[] 数组,std::cin &gt;&gt; name;std::cin &gt;&gt; answer1; 是等待发生的缓冲区溢出。使用std::setw() 流操纵器来限制operator&gt;&gt; 可以读入每个数组的字符数。或者使用std::cin.get(char*, std::streamsize) 方法读入数组。或者,停止使用 char[] 数组并改用 std::string
  • @RemyLebeau 我想我会切换 std::string 直到我能完全理解你评论的另一半。谢谢你的建议。

标签: c++ pointers if-statement integer c-strings


【解决方案1】:

变量answer1被声明为字符数组

char answer1[50];

在这个if语句的条件下

if (answer1 == 'Yes' && answer1 == 'yes') {

数组指示符被隐式转换为指向其第一个元素(字符)的指针,该元素的类型为char *

另一方面,例如这个文字 'Yes' 是一个多字节字符文字,其类型为 int

因此,您尝试将数组的第一个字符的地址与具有实现定义值的整数进行比较。很明显,这没有意义。

您需要使用标头&lt;cstring&gt; 中声明的标准C 函数strcmp。而不是字符文字,而是使用字符串文字。

您还必须在条件中使用逻辑 OR 运算符 || 而不是逻辑 AND 运算符 &amp;&amp;

例如

#include <cstring>

//…

if ( strcmp( answer1, "Yes" ) == 0 || strcmp( answer1, "yes" ) == 0 ) {

如果使用标准类std::string而不是字符数组,程序会更安全。

【讨论】:

  • 这个答案对我有用,谢谢。您介意再解释一下为什么之后会有“== 0”吗?这是在做什么?
  • @DylanBarnes 如果两个字符串相等,则函数 strcmp 返回 0。
【解决方案2】:

这:'Yes' 是字符文字,而不是字符串文字。多字符文字具有int 类型的实现定义值,并且不是您想要使用的。它们是一种晦涩难懂的语言特性,很少有用,但它们似乎是新程序员的常见绊脚石。

你会想要这个:

if (answer1 == "Yes" && answer1 == "yes")

除非您将answer 定义为字符数组。比较会编译,但它不会做你想要的。它将比较 char* 指针值,而不是字符串的内容,并且比较总是会失败。

使用在&lt;string&gt; 标头中定义的std::string,可以让您使用重载的== 运算符进行比较。 (要比较存储在字符数组中的 C 风格字符串,您必须使用在 &lt;cstring&gt; 中声明的 strcmp(),但在 C++ 中这样做没有什么意义。)

【讨论】:

  • 我仍然有点不确定如何使用“std::string”应用您的解决方案。澄清一下,而不是使用“std::cin >> answer1;”要接收我的输入,我使用“std::string >> answer1;”将答案存储到“answer1”变量中?
  • @DylanBarnes 他的意思是 char answer1[50]; 变为 std::string answer1;std::cin &gt;&gt; answer1; 保持 std::cin &gt;&gt; answer1;
  • @user4581301 太好了。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-12
相关资源
最近更新 更多