指针与整数C ++的比较

问题描述 投票:2回答:2

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

ISO C ++禁止在指针和整数[-fpermissive]之间进行比较,如果(answer1 =='是'&& answer1 =='是){

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

但是当我尝试使用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++ pointers if-statement integer c-strings
2个回答
2
投票

变量answer1被声明为字符数组

char answer1[50];

在此if语句的条件下

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

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

例如,此文字'Yes'是具有类型int的多字节字符文字。

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

您需要使用在标头strcmp中声明的标准C函数<cstring>。而不是字符文字,而是使用字符串文字。

此外,您还必须在条件内使用逻辑或运算符||代替逻辑与运算符&&

例如

#include <cstring>

//…

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

如果使用标准类std::string代替字符数组,则程序将更安全。


1
投票

此:'Yes'是字符文字,而不是字符串文字。多字符文字具有实现定义的int类型的值,而不是您要使用的值。它们是一种不起眼的语言功能,很少使用,但是对于新程序员来说,它们似乎是一个常见的绊脚石。

您想要这个:

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

除了您已将answer定义为字符数组。比较将编译,但不会执行您想要的操作。它将比较char*指针值,而不是字符串的内容,并且比较将始终失败。

使用std::string标头中定义的<string>,将使您可以使用重载的==运算符进行比较。 (要比较存储在字符数组中的C样式字符串,您必须使用在strcmp()中声明的<cstring>,但在C ++中这样做毫无意义。)

© www.soinside.com 2019 - 2024. All rights reserved.