使用==

时间:2015-06-09 03:01:09

标签: c++ string if-statement

可以遵守如下所示的代码。

问题:即使我输入正确的员工ID,它也总是会显示“无效的员工ID”。
请告诉我为什么以及如何正确地做到这一点。

#include <iostream>
#include <iomanip>
using namespace std;
char select, js;
char empid[4];
double bSalary, bonus, tot=0.0;
int main()
{
    do
    {
        cout<<"Employee id: ";
        cin>>empid;
        if(empid=="M001" || empid=="A004" || empid == "M002") //these are employee ids
        {   
            cout<<"Job Status: ";
            cin>>js;
            if(js=='P' || js=='C')
            {
                cout<<"Basic Salary: ";
                cin>>bSalary;
                if(bSalary>75000 && js=='P')
                {
                    bonus = bSalary*(20.0/100.0);
                    tot = tot + bonus + bSalary;
                }
                else if(bSalary>75000 && js=='C')
                {
                    bonus = bSalary*(15.0/100.0);
                    tot = tot + bonus + bSalary;
                }
                else
                    tot = tot+bonus+bSalary;
            }
            else
                cout<<"Invalid Job Status"<<endl;
        }
        else
            cout<<"Invalid Employee no"<<endl;
        cout<<"Do you want to continue: ";
        cin>>select;
        cout<<endl;
    }while(select=='y'||select=='Y');
    cout<<"Total cost: "<<setprecision(2)<<setiosflags(ios::fixed)<<tot<<endl;
    return 0;
}

注意:它会一直转到else子句。

4 个答案:

答案 0 :(得分:11)

就是这样:

char empid[4];

这个太小了,因为在id之后没有NUL终结器的空间。您可以将其更改为5,但如果有人故意或意外地键入更长的字符串,您的程序可能会崩溃(它被称为缓冲区溢出,在某些情况下可以允许任何提供输入的人破解运行该程序的帐户)。

此外,==不适用于字符数组:您必须使用例如:

 if (strcmp(empid, "M001") == 0 || strcmp(empid, "A004") == 0 || ...

使用std::string会更好,它会增加以适应实际输入(包括NUL终止符,但不计入string的{​​{1}}),并使用.size()直观地工作。

另外,你......

==

...被打破,因为tot = tot+bonus+bSalary; 可能未被初始化,你不能在表达式中读取它。您可以从上面的添加中删除bonus,如果相关员工的意图为0。

答案 1 :(得分:4)

您无法将C字符串与==或!=进行比较。你可以看到这里的empid只是一个指针,所以==会比较那些字符串的基地址而不是字符串本身。

您需要使用strcmp并包含

#include <cstring>
.
.
.
if(strcmp(empid,"M001")==0 || ...)

答案 2 :(得分:3)

Empid不是字符串。 C ++没有内置的==重载来比较char数组。

您可以创建自己的==运算符。但不要打扰。将empid声明为字符串并观察魔法发生。

string empid;

答案 3 :(得分:2)

更改char数组的大小以处理NULL char在这里不起作用。

char empid[5]

&#34; ==&#34;运算符与char数组无法正常工作。请将条件更改为:

if (0 == (strcmp(empid, "M001")) || (0 == (strcmp(empid, "A004"))) || (0 ==     
   (strcmp(empid, "M002"))))
编辑:上面的人已经回答了你的问题。我现在的答案是多余的。