C ++收银机程序不使用<string> </string>

时间:2015-01-08 09:39:45

标签: c++ c-strings

我必须在不使用字符串的情况下编写程序。这是我的代码:

#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;
}

我有几个问题:

  1. 如果cin.ignore(100, '\n');之后我没有使用cin >> item[i].productPrice;,为什么程序会崩溃?它只是cin没有任何条件,所以它不应该在输入流中留下新的行字符?

  2. 如何检查价格是否包含不正确的输入(因此它只有十进制或浮点数)?

  3. 如何检查名称是否包含字符和数字> 0(除了-1)?

  4. 在这种情况下使用cin.getline会更好吗?

1 个答案:

答案 0 :(得分:1)

  1. cinistream,因此如果您使用cin.get(),它应该在流中保留换行符。我没有测试这是否是导致您坠机的原因,但听起来这可能会给您带来麻烦。

  2. char只是数字。 .为46,数字字符为48到57.您可以将价格输入读入缓冲区,并检查是否读取了任何没有所需值的字符。如果您发现不需要的字符,则可以决定是否要重复输入,忽略此项目或退出程序。

  3. else分支中,检查productName的第一个字符是否为' - '。这样,您就已确保productName不是-1

  4. cin.getline()会丢弃换行符,因此您可以避免使用cin.ignore()