“if”和“else if”命令在c ++中不起作用

时间:2016-11-13 01:41:11

标签: c++ if-statement

我正在制作一个聊天机器人,我只是在这一点上进行实验。但我的“if”命令不起作用,当我输入“moodToday”时,它只是跳到了else命令。

(“moodToday”的大小写不是错误)

任何和所有帮助将不胜感激

#include <fstream>
#include <cmath>
using namespace std;

 int main() {

     char name[50], moodToday[50];


     cout << "A few things you should know at this time..." << endl << "1. I can't process last names." << endl << "2. I can't process acronyms." << endl;
     system("pause");
     cout << endl << endl << "What is your name?" << endl;
     cin >> name;
     cout << "Hello " << name << "." << endl << "How are you today?" << endl;
     cin >> moodToday;


     //can't figure this out...
     if ((moodToday == "sad") || (moodToday == "bad") || (moodToday == "horrible")) {
         cout << "That's not good." << endl << "Why are you feeling " << moodToday << "today?" << endl;
     }
     else if (moodToday == "good") {
         cout << "Great!" << endl;
     }
     else {
         cout << "I'm sorry, I don't undrestand that feeling." << endl;
     }


     system("pause");

     return 0;

}

4 个答案:

答案 0 :(得分:4)

要比较包含字符串的字符数组,您应该使用标题C函数,例如标题std::strcmp中声明的<cstring>。例如

#include <cstring>

//...

if ( std::strcmp( moodToday, "sad" ) == 0 ) std::cout << "They are equal << std::endl;

否则就像这样的陈述

if ((moodToday == "sad") ) /*...*/

比较了两个指针:指向数组moodToday的第一个字符的指针和指向字符串文字"sad"的第一个字符的指针,因为在极少数例外的表达式中使用的数组将转换为指向他们的第一个角色。

考虑到operator >>与字符数组的使用是不安全的

cin >> moodToday;

使用这样的成员函数getline

cin.getline( moodToday, sizeof( moodToday ) );

或者您可以使用标准类std::string代替字符数组。

在比较之前,考虑将输入字符串的所有字母转换为字符串文字的大小写的可能性。您可以使用标头tolower中声明的标准C函数toupper<cctype>来执行此操作。

答案 1 :(得分:1)

使用strcmp代替==运营商。

如果您将moodToday定义为字符串对象,则==将起作用。

答案 2 :(得分:1)

与使用比较对象地址的java中的问题类似,您正在做的是比较内存地址。因此,您希望使用strcmp(str1,“literal”)== 0来查看它们是否相等。

#import <cstring>
if(strcmp(str1, "literal") == 0) dothis();

答案 3 :(得分:1)

如果您正在使用C ++,那么您应该使用std::string而不是旧的C风格缓冲区。

#include <string>

int main() {
  std::string name, moodToday;
}

C ++字符串明显优于C字符串,因为它们没有buffer overflow个问题,很容易与==进行比较。

另外,作为提示,请尽量避免使用using namespace std;,因为这会导致命名空间冲突。同样令人讨厌,因为它可以一直键入std::,它确实清楚地表明该类或模板源自何处以及谁负责代码。这样你自己的类和模板是显而易见的。