菜单的C“指针和整数之间的比较”警告

Posted

技术标签:

【中文标题】菜单的C“指针和整数之间的比较”警告【英文标题】:C "comparison between pointer and integer" warning for menu 【发布时间】:2013-11-23 23:08:30 【问题描述】:

我正在尝试编写一个程序,该程序涉及比较字符作为菜单系统的一部分,用于解码电阻器代码的程序。在菜单末尾,它会询问您是否要解码另一个电阻,如果用户选择“是”,则重复该程序。

这是我目前的代码:

  //used for repeating input menu
  int menu = 0;
  char menuChoice = 0;

  //rest of program goes here      

  printf("Do you want to decode another resistor? (y/n)");
  scanf("%c", &menuChoice);

  while(menuChoice != "y" && menuChoice != "Y" && menuChoice != "n" && menuChoice != "N")
  
    if(menuChoice != "Y" && menuChoice != "y")
    
      if(menuChoice == "N" || menuChoice == "n")
      
        menu = 0;
      

      else
      
        printf("Invalid choice.");
      
    
  

当我尝试使用 GCC 进行编译时,我得到了一条警告,上面写着“指针和整数之间的比较”。由于 scanf 只接受一个指针,我不知道如何将扫描的字符与“Y”或“n”进行比较。我这里有什么遗漏吗?

【问题讨论】:

字符文字需要 char_literal 字符,例如。 'y' 不是 "y" 您收到关于指针的令人困惑的错误消息的原因是字符串文字是数组类型,并且在大多数情况下,数组表达式会隐式转换为指向数组第一个元素的指针.因此menuChoice != "Y" 尝试将整数值menuChoicechar 是一个整数类型)与"Y" 隐式转换为char* 产生的指针值进行比较。比较没有任何意义。事实上,我对 gcc 只是警告它感到失望。它可以,恕我直言,应该将其视为致命错误。 @KeithThompson 如果 gcc 开始为隐式指针整数转换提供错误,它可能会唤醒一群人来修复他们的旧代码 【参考方案1】:

您使用的是字符串文字语法"a",而不是字符文字语法'a'

More about the difference

【讨论】:

【参考方案2】:

调整你的比较。目前他们比较一个整数(或char,例如menuChoice)和一个数组(例如“y”)。

// menuChoice != "y"
menuChoice != 'y'

while(menuChoice != "y") && ...) 可能应该被删除。

if(menuChoice == "N" ... 应该是 else if(menuChoice == "N" ...)

【讨论】:

以上是关于菜单的C“指针和整数之间的比较”警告的主要内容,如果未能解决你的问题,请参考以下文章

ISO C++禁止指针和整数之间的比较?

selenium之鼠标悬停/警告框处理/多窗口切换/下拉菜单的处理的介绍

Qt错误iso c++禁止指针和整数之间的比较-fpermissive

Keil MDK忽略某一警告

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

怎么取消循环引用警告