【问题标题】:ERROR char and const char错误字符和常量字符
【发布时间】:2013-12-20 12:54:33
【问题描述】:

我对编程很陌生,我编写的代码让我感到困惑。你能解释一下以下错误吗?

int getBill(char seat)// a return function.
{
    int b=0;
    char FS, fs, LBS, lbs, UBS, ubs, GPS, gps;
    char seat;
    if(seat=="FS"||seat=="fs")
    b=15000;
    if(seat=="LBS"||seat=="lbs")
    b=10000;
    if(seat=="UBS"||seat=="ubs")
    b=5000;
    if(seat=="GPS"||seat=="gps")
    b=1500;

    return b;
}

错误:操作数类型不兼容(char 和 const char)

【问题讨论】:

  • 您正在尝试将单个字符与字符串进行比较。而且你已经两次声明了同一个变量。
  • 而且你的大部分变量都没有初始化。
  • char 是单个字符。如果您想要多个字符,请使用一个数组(作为指向您的函数的指针传递)。使用 strcmp() 比较字符串, == 不会做你期望它做的事情。此外,您不必为函数中使用的字符串文字声明变量 (FS, fs, ...)。
  • 哦。好吧好吧。我认为使用 == 仍然会和 strcmp 一样。我会试试的。谢谢!
  • @GuntramBlohm:这是 C++。对字符串使用std::string

标签: c++ char constants


【解决方案1】:

将您的函数更改为采用std::string 而不是单个char。并删除多余的char 声明。

int getBill(const std::string &seat)// a return function.
{
    int b=0;

    if(seat=="FS"||seat=="fs")
     ....

请注意,usually 通过const 引用传递结构的效率要高得多,如上所示。

【讨论】:

  • 我在将 const ref 传递给 std:string 时遇到过不好的经历。我还认为现代实现已经过优化,因此传递 std:string 实际上与传递“裸”字符指针一样便宜。
  • @S.C.Madsen 可能是编译器或库有问题?至于性能,测量它,我相信你;-)(顺便说一下,我认为 C++11 禁止引用计数字符串)
  • 我同意您衡量性能声明的倾向,建议您对自己的声明也这样做。
  • 如何使用它作为指针?我要这样写吗? rsrve.bill=getBill(const std::string &seat)
  • @HanzMendez - 请添加代码以显示您希望如何使用它的上下文。
【解决方案2】:

您的代码看起来像 C 代码。在 C 中,“字符串”是字节数组。大多数函数通过所谓的“零终止符”(一个值为零的字节)来计算所述数组的结尾。字符串(或“数组”)的各个元素被称为字符的“char”。

只能对适合 CPU 寄存器的“项目”执行逻辑操作,即将单个字节与另一个字节、一个整数与另一个整数进行比较。为了比较字符串,您需要执行一个循环,比较字符串(数组)的每个字符(字节)。幸运的是,C 附带了一个标准库,其中包含许多其他有用的东西,其中包含用于操作字符串的函数。具体来说,函数strcmp 将比较两个字符串,如果遇到零终止符,则返回第一个不匹配字符的差值或零。

要使用 strcmp 实现 getBill 例程,您可以执行以下操作:

#include <string.h> /* contains definition of strcmp() */
int getBill(char *seat)
{
    int b=0;
    char seat;
    if(0 == strcmp(seat, "FS") || 0 == strcmp(seat,"fs"))
      b=15000;
    if(0 == strcmp(seat, "LBS") || 0 == strcmp(seat, "lbs"))
      b=10000;
    if(0 == strcmp(seat, "UBS") || 0 == strcmp(seat, "ubs"))
      b=5000;
    if(0 == strcmp(seat, "GPS") || 0 == strcmp(seat, "gps"))
      b=1500;

    return b;
}

/* example use: */

  getBill("FS);

更“高级”的解决方案是使用“不区分大小写”的比较函数,并将定义的值放在“表”中。比如:

#include <string.h> /* contains definition of stricmp() */

static const char* bill_types_str[] =
{
  "fs", "lbs", "ubs", "gps"
};

static const int bill_type_ids[] =
{
  15000, 10000, 5000, 1500
};

int getBill(char *seat)
{
  for(i=0; i < sizeof(bill_types_str)/sizeof(bill_types_str[0]; i++)
    if (0 == stricmp(seat, bill_types_str[i]))
      return bill_types_id[i];

  return 0;
}

这样做,可以很容易地添加新的“账单类型”,并且还允许以后的功能列出支持的“账单类型”。

【讨论】:

    【解决方案3】:

    您正在尝试将 sting(或 char 数组)与 char 进行比较。

    你的意思是?

    字符座位[SOME_INT_VALUE];

    而不仅仅是

    字符座位

    【讨论】:

      猜你喜欢
      • 2022-11-19
      • 2015-09-17
      • 1970-01-01
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      • 1970-01-01
      • 2013-12-13
      • 2023-03-08
      相关资源
      最近更新 更多