【问题标题】:Converting multiple character variables to numbers in if statement在if语句中将多个字符变量转换为数字
【发布时间】:2019-05-02 13:40:17
【问题描述】:

我正在尝试使用“if”语句将用户输入的单词(黑色、红色、绿色、蓝色)转换为整数(1、2、3、4)。编程很新,所以欢迎任何解释。下面的代码告诉我“与字符串文字比较会导致未指定的行为”,并且总是使用“else”因素,给我 4。

变量声明:

int calccol = 0;
char usercol[5];

用户输入颜色选择:

std::cout << "Pick a color: " ;
 std::cout << "\n Black \n Red \n Green \n Blue \nYour color choice: " ;
 std::cin >> usercol ;

if 语句失败:

if (usercol == "black") {
      calccol = calccol + 1;
  } else if (usercol == "red") {
      calccol = calccol + 2;
  } else if (usercol == "green"){
      calccol = calccol + 3;
  } else {
      calccol = calccol + 4;
  } ;

   std::cout << calccol ;

当用户输入单词“green”时,我希望 calccol 的值例如为 3。

【问题讨论】:

  • char usercol[5]; 没有足够的空间来存储五个字母 一个空终止符。此外,比较char*== 不会比较它们所指向的字符串的值。它只是检查它们是否指向相同的地址(在这种情况下它们不会)。
  • stackoverflow.com/questions/30674309/… 的部分副本我正在寻找另一个解决缓冲区太小的问题。
  • 你收到a good C++ book了吗?这是绝对必要的。

标签: c++ string string-comparison


【解决方案1】:

你不能比较 char* 这样的平等。您必须使用strcmp 并查看结果是否为0。但既然这是 C++,为什么不改用 std::string 呢?只需更改此行:

char usercol[5];

到这里:

std::string usercol;

它按预期工作。


下面是它如何使用 C 风格的字符串来代替: 首先,您需要确保缓冲区足够大,以前没有:

char usercol[10]; // has to be big enough to hold the choice

在本例中,它的大小为10,即输入文本的大小为 9,表示字符串结束的空终止符为 1。一个问题是(可能是恶意的)用户可以输入更大的字符串,导致缓冲区溢出,这是未定义的行为,可能会导致内存损坏。需要更复杂的解决方法来防止这种情况发生,例如,请参阅 this answer

接下来,您需要修正比较。 usercol == "black" 不起作用,因为它将缓冲区的地址与放在程序可执行文件中的硬编码 "black" 的地址进行比较。他们永远不会匹配。相反,strcmp 必须像这样使用:

if (!strcmp(usercol, "black")) {...

strcmp 如果字符串相等则返回0,否则返回。这些将分别隐式转换为falsetrue。通过在它前面添加!,反转它。这给了我们想要的结果:如果usercol 的字符串内容与"black" 的字符串内容相同,则if (!strcmp(usercol, "black"))true

【讨论】:

  • 谢谢,不知道这一点我觉得很愚蠢。不过我下次知道了,你能解释一下strcmp的用法和char后面的*吗?
  • @Universe31 strcmp 在这里不起作用。它仅适用于要求字符串以空终止符结尾的字符串。你需要一个char 来持有它。您必须首先使usercol 比您希望它存储的最大字符串大一个。
  • @Universe31 很高兴它有帮助。值得称赞的是,您也对 C 风格的解决方案感兴趣,因此我添加了有关如何使用 char 数组和 strcmp 进行操作的说明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-23
  • 2016-05-15
  • 1970-01-01
  • 2019-09-15
  • 1970-01-01
  • 2017-05-30
  • 1970-01-01
相关资源
最近更新 更多