可以遵守如下所示的代码。
问题:即使我输入正确的员工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
子句。
答案 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"))))
编辑:上面的人已经回答了你的问题。我现在的答案是多余的。