【问题标题】:Simple C++ programme; can't seem to get it right简单的 C++ 程序;似乎无法正确
【发布时间】:2017-01-09 18:29:33
【问题描述】:
#include<iostream>
#include<conio>
#include<string>

using namespace std;

class CompanyName
{
public:

    char name[10];

    void display()
    {
        if(name=="emily")
            cout<<"Hired!"<<endl;
    }
};

void main()
{
    CompanyName c;

    cout<<"enter name"<<endl;
    cin>>c.name;

    c.display();

    getch();
}

所以我的朋友刚刚被安置在一家公司,我想通过一个小型 CPP 程序在她的 Facebook 墙上祝贺她(并宣布某某公司雇用了她)。我不想只打印“恭喜艾米丽!”因为我已经这样做了。所以这一次你只要看代码就可以看到我想要做什么。任何更好的建议都非常受欢迎。 但我的问题是,我无法运行此代码。我觉得'if'线不对。有人可以为我更正代码吗?我还是个初学者。

【问题讨论】:

  • 如果你要处理字符串,你应该使用std::string。
  • @Cersei 您不能使用原始字符数组应用== 相等测试运算符,要么使用strcmp(),要么将name 的类型更改为std::string。
  • 想指出房间里的大象,conio 不是标准标题。停止使用它。
  • 首先,在心理上让自己在没有&lt;conio&gt; 的情况下生活,因为它不是标准的 C++,而且肯定是过去的遗产。然后,如果您包含&lt;string&gt;,请在string name; 中使用它们。最后,您能否澄清一下您的期望:您真的期望在 FB 上发布网络代码的答案吗?除了“祝贺”你还能打印什么?文字从何而来? Emily 是公司唯一的员工吗?
  • @Thebluefish 而void main呢?

标签: c++ if-statement char


【解决方案1】:

您将name 声明为char name[10];,然后name 将被视为指针。你的指针永远不会等于字符串"emily"。

解决方案:强烈建议简单地使用来自#include &lt;string&gt; 的伟大std::string

这应该可以工作(因为您已经包含了该库):

class CompanyName
{
public:
    std::string name;

    // ..
        if (name == "emily")
           // cout
    // ..
};

【讨论】:

  • 不客气,但不要忘记提出解决方案,即使它已经在其他答案中。
  • 完成。再次感谢:)
【解决方案2】:

你不能只使用==操作符比较name,因为它是一个char数组,你应该使用strcmp(name, "emily") == 0

更好的是,使用std::string 类来存储和操作字符串,使用std::string,您可以简单地使用== 运算符进行比较。

另一件事:你不应该使用getch(),因为它不是标准的c++。

【讨论】:

  • 所以我应该使用 getchar();代替?
  • 你在使用getch(),只是为了让你的屏幕停一会?
  • 不,要在屏幕上获得输出。
  • cout 得到输出到屏幕,getch() 只是让你的程序等待一段时间,直到你按下某个键继续(getch() 可以用来接受输入,但它是不推荐使用)。
  • 但是你也可以使用cin.get()来达到这个目的,(它也会停止,直到你按下Enter键)
【解决方案3】:

你知道,如果你使用std::string,这段代码会更容易。请看下面的代码:

#include <iostream>
#include <string>

using namespace std;

class CompanyName {
public:
    string name;

    void display()
    {
        if (name == "emily")
            cout << "Hired!" << endl;
    }
};

int main()
{
    CompanyName c;

    cout << "enter name" << endl;
    cin >> c.name;

    c.display();
    return 0;
}

那么这里对字符串的大小没有限制。顺便说一句,你的代码不起作用,因为它只能包含 9 个字符,+\0,这意味着你的字符串太长了。使用上面的解决方案。 Live Example

【讨论】:

  • 我不知道你可以使用“字符串名称”。我们只被教导在 CPP 中使用 char 数组(但我们确实在 C 中使用了字符串)。我想我记得我的老师说你不能?在 CPP 中使用“字符串”,但可能是我误解了...非常感谢!
【解决方案4】:

在 C++ 中直接比较字符数组和字符串是不安全的。正如其他人建议的那样,尝试使用std::string,它将为您处理所有背景内容。

这是一个使用类的析构函数的有趣示例:

#include<iostream>
#include<string>

using namespace std;

class CompanyName
{
public:
    std::string name;
    ~CompanyName()
    {
        if (name == "emily")
            cout << "Hired!" << endl;
        else cout << "Who's that?" << endl;
    }
};

int main()
{
    CompanyName c;
    cout << "Enter new employee name" << endl;
    cin >> c.name;
    return EXIT_SUCCESS;
}

在线编译:http://cpp.sh/433h7

【讨论】:

  • 让它更加误导。
  • 非常感谢,这很有帮助!不过,我还有一些疑问,比如为什么你使用析构函数而不是构造函数? EXIT_SUCCESS 不是 int 值吗?
  • @Thebluefish 误导?
  • @Cersei 对于刚开始使用 C++ 的人,最好复习一下最佳实践。坦率地说,一种基于析构函数的标准方法是误导性的。
  • @Cersei,这个解决方案不属于最佳实践,但它仍然很有趣。 C++ 遵循一个称为RAII 的习语,它本质上是指C++ 在作用域内维护变量的时间。当程序遇到return 关键字时,作用域中的变量将被销毁,因此CompanyName 析构函数会在此时自动运行——这是检查和打印名称的时候。 EXIT_SUCCESS 是在stdlib 中定义的宏,它解析为正确的int 以成功终止。
猜你喜欢
  • 2017-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-10
  • 2017-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多