我必须在不使用字符串的情况下编写程序。这是我的代码:
#include <iostream>
#include <iomanip>
using namespace std;
struct product
{
char productName[100];
double productPrice = 0;
};
const int MAX_CHAR = 101;
const int MAX_ITEM = 100;
int main()
{
product item[MAX_ITEM];
double total = 0;
int count = 0;
for (int i = 0; i < MAX_ITEM; i++)
{
cout << "Please , enter the product name(for checkout type -1) : ";
cin.get(item[i].productName, MAX_CHAR, '\n');
cin.ignore(100, '\n');
if (strcmp(item[i].productName, "-1") == 0 ) {
break;
}
else {
count++;
cout << "Please , enter the price for " << item[i].productName << " : $";
cin >> item[i].productPrice;
cin.ignore(100, '\n');
total += item[i].productPrice;
cout << endl << "Product entered : " << item[i].productName << " " << "$"
<< fixed << setprecision(2) <<item[i].productPrice << endl;
cout << "Total : $" << total << endl << endl;
}
}
cout << endl << "###############";
cout << endl << "Your Receipt : " << endl << endl;
for (int i = 0; i < count; i++) {
cout << item[i].productName << " $" << fixed << setprecision(2) << item[i].productPrice << endl;
}
cout << endl << "Total : $" << total;
cout << endl << "###############";
getchar();
getchar();
return 0;
}
我有几个问题:
如果cin.ignore(100, '\n');
之后我没有使用cin >> item[i].productPrice;
,为什么程序会崩溃?它只是cin
没有任何条件,所以它不应该在输入流中留下新的行字符?
如何检查价格是否包含不正确的输入(因此它只有十进制或浮点数)?
如何检查名称是否包含字符和数字> 0(除了-1)?
在这种情况下使用cin.getline
会更好吗?
答案 0 :(得分:1)
cin
是istream
,因此如果您使用cin.get()
,它应该在流中保留换行符。我没有测试这是否是导致您坠机的原因,但听起来这可能会给您带来麻烦。
char
只是数字。 .
为46,数字字符为48到57.您可以将价格输入读入缓冲区,并检查是否读取了任何没有所需值的字符。如果您发现不需要的字符,则可以决定是否要重复输入,忽略此项目或退出程序。
在else
分支中,检查productName
的第一个字符是否为' - '。这样,您就已确保productName
不是-1
。
cin.getline()
会丢弃换行符,因此您可以避免使用cin.ignore()
。