【问题标题】:String Comparison in C++ with IF Statements?C ++中的字符串比较与IF语句?
【发布时间】:2018-10-15 12:52:03
【问题描述】:

我对 C++ 很陌生,大约 30 分钟前才开始使用在线课程学习。我有点困惑为什么这个字符串比较在基本的数学脚本中不起作用:

#include <iostream>
#include <string>
using namespace std;

int main() {
  int one, two, answer;
  char *oper;

  cout << "Add two numbers\n\nEnter your first number" << endl;
  cin >> one;
  cout << "Choose an operator: +  -  *  /  %%" << endl;
  cin >> oper;

  cout << "Enter your second number" << endl;
  cin >> two;

  if (oper == "+") {
    answer = one + two;
  }
  else if (oper == "-") {
    answer = one - two;
  }
  else if (oper == "*") {
    answer = one * two;
  }
  else if (oper == "/") {
    answer = one / two;
  }
  else if (oper == "%%") {
    answer = one % two;
  }

  cout << one << " " << oper << " " << two << " = " << answer << endl;

  return 0;
}

oneopertwo 的值分别为1"+"1,但最终打印出1 + 1 = 4201435。没有if/else if 语句正在执行。这是什么原因造成的?

【问题讨论】:

  • oper == "+" 比较指针而不是字符串,因为 operchar*
  • 使用cin &gt;&gt; oper 假定oper 指向适当的缓冲区。你的是未初始化的。事实上,鉴于这是用户输入,没有办法知道缓冲区是否合适。永远不要这样做。如果您使用std::string,这不是问题。

标签: c++ compare string-comparison comparison-operators


【解决方案1】:

您正在使用operator== 比较char *。要么让oper 改为std::string

std::string oper

要使用此处列出的字符串比较:http://en.cppreference.com/w/cpp/string/basic_string/operator_cmp

或者,如果您需要使用char * 进行某些限制,请使用strcmp

if (!strcmp(oper, "+")) {
// ...

您还需要将操作数变量指向某个缓冲区,以便读取流。这有点复杂,我只是建议将oper 的类型更改为std::string

您拥有的代码的问题在于它正在比较指向 char 数组的指针。您从输入法中获得的将是来自输入流的新字符串,并且永远不会与程序中的只读字符串具有相同的地址。

因此,由于没有一个条件是true,因此还没有分配 ans。所以输出它解释了一个未定义的行为

【讨论】:

  • 我尝试将oper定义为std::string oper,虽然编译没有错误,但打开.exe导致错误:The procedure entry point _ZNKSt7__cxx1112basic_stringlcSt11char_traitslcESalcEE7compareRPKc could not be located in the dynamic link library C:\Users\me\Documents\math.exe
  • 听起来你的链接器有一些问题。你在用什么编译器?
  • 我用的是mingw的g++编译器
  • 太棒了,什么编译器标志?
  • 对了,你能在MinGW/bin目录下运行可执行文件而不会崩溃吗?
猜你喜欢
  • 1970-01-01
  • 2016-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多