为什么不在循环内重置字符串?

时间:2017-02-23 15:44:47

标签: c++ string loops while-loop

我为一个班级制作了一个小型的桌面成本计划。我想在其中加入一个循环。但每次我到达程序结束并将其循环回到开头时,它会跳过我要求客户名称的部分并将其留空。知道怎么解决吗?

这是我的代码:

#include <iostream>            // needed for Cin and Cout
#include <string>              // needed for the String class
#include <math.h>              // math functions
#include <stdlib.h>             
using namespace std;

#define  baseCost  200.00
#define  drawerPrice 30.00

int main(void)
{
    while(true)
    {
        string cname;
        char ch;

        cout << "What is your name?\n";
        getline(cin, cname);

        cout << cname;

        cout << "\nWould you like to do another? (y/n)\n";
        cin >> ch;

        if (ch == 'y' || ch == 'Y')
            continue;
        else
            exit(1);
    }

    return 0;
}

1 个答案:

答案 0 :(得分:0)

问题是你需要在提示退出后调用cin.ignore()。当您使用cin获取'ch'变量时,换行符仍然存储在输入缓冲区中。调用cin.ignore(),忽略该字符。

如果不这样做,您会注意到程序会在第二个循环中打印换行符作为名称。

您还可以将'ch'变量设为'cname'之类的字符串,并使用getline而不是cin。然后你不必发出cin.ignore()调用。

#include <iostream>            // needed for Cin and Cout
#include <string>              // needed for the String class
#include <math.h>              // math functions
#include <stdlib.h>
using namespace std;

#define  baseCost  200.00
#define  drawerPrice 30.00

int main()
{
    while(true)
    {
        string cname;
        char ch;

        cout << "What is your name?\n";
        getline(cin, cname);

        cout << cname;

        cout << "\nWould you like to do another? (y/n)\n";
        cin >> ch;

        // Slightly cleaner
        if (ch != 'y' && ch != 'Y')
            exit(1);

        cin.ignore();

        /*
        if (ch == 'y' || ch == 'Y')
            continue;
        else
            exit(1);
        */
    }

    return 0;
}