使用getline代替cin>>

时间:2011-02-01 01:02:33

标签: c++

嘿伙计,所以我的程序如下,但是当我输入一个以w,d,b或q开头的单词时,例如存款而不是字母d,程序只是不断重复“你愿意”的初始问题吗?提款,存款等。“我试图转换cin>> getline(cin,user_request),但这给了我一个错误。我很确定解决这个问题的方法是将cin转换为getline,但我不确定如何正确。如果有人可以帮忙。有没有办法用cin语句执行此程序? :

#include <iostream>
#include <string>
using namespace std;

int main ()
{
   char user_request;
   string user_string;
   double account_balance, dollars_withdraw, dollars_deposit;

   account_balance = 5000;
   user_request= user_string[0];


   while(account_balance =>0)
     {
        cout << "Would you like to Withdraw, Deposit, Check your balance or Quit?" 
           << endl;
        cin >> user_request;
        if (user_request == 'w' || user_request== 'W')
        {
           cout << "How much would you like to withdraw?" << endl;
           cin >> dollars_withdraw;
        if (dollars_withdraw > account_balance)
           cout << "Invalid transaction" << endl;
        else 
           account_balance = account_balance - dollars_withdraw;
           cout << "Your new balance is $" << account_balance << endl;
        }

        if (user_request == 'd' || user_request== 'D')
        {
           cout << "How much would you like to deposit?" << endl;
           cin >> dollars_deposit;
           account_balance= account_balance + dollars_deposit;
           cout << "Your new balance is $" << account_balance << endl;
        }
        if (user_request == 'b' || user_request == 'B')
      {
           account_balance= account_balance;
           cout << "Your available balance is $" << account_balance << endl;
      }
        if (user_request == 'q' || user_request == 'Q')
           break;
   }

   cout << "Goodbye" << endl;



  return 0;
}

7 个答案:

答案 0 :(得分:4)

虽然user_requestchar,但输入中的每个非空格字符都会满足另一个cin >> user_request;语句,因此输入“deposit”将循环7次,只有'd'匹配if语句,但每次都会打印提示信息。

您应该将user_request更改为std::string,然后getline(cin, user_request) 工作,但您需要比较user_request的第一个字符(即[0])到例如"w"(字符串文字)而不是'w'(字符文字)。

检查输入请求是否有效也是一种好习惯 - 文件结束条件会导致循环永远“旋转”。

更改提示符也是一个好主意,因此它会提到您希望键入的字母,否则他们可能会输入例如“c”而不是“b”代表“支票余额”。只需cout类似:

Would you like to [W]ithdraw, [D]eposit, Check your [b]alance or [Q]uit?

所以,全部:

std::string user_request;

if (not getline(cin, user_request))    // or !getline(...) if your compiler lacks "not"
    break;

if (user_request.empty())
    continue;  // avoid [0] on an empty line, which may crash the program

if (user_request[0] == "w" || user_request[0] == "W")
    ...

答案 1 :(得分:2)

从标准中取std::string,输入一个单词(由空格分隔)

std::string input;
if( std::cin >> input ) {
    if( ! input.empty() && input[0] == 'd' || input[0] == 'D' )
        // ...
}

或使用std::getline()

整行
std::string line;
if( std::getline(std::cin, line) ) {
    if( ! line.empty() && line[0] == 'd' || line[0] == 'D' )
        // ...
}

当然,如果用户输入多个单词,则从std::string获取std::cin,那么您就会遇到与您在问题中提到的多个字符相同的“问题”

答案 2 :(得分:1)

如上所述,cin >>有点挑剔,如果尝试读取错误类型的值,则会进入“失败状态”。实际上还有许多其他失败模式,因此从控制台读取输入的首选方法是使用getlinestringstreams的某种组合。如果您有兴趣,可以在线获得斯坦福大学的入门C ++编程课程has an entire chapter on how to do this,该课程涵盖从cout和文件I / O的基础到如何从控制台正确安全地获取数据的所有内容。

希望这有帮助!

答案 3 :(得分:1)

当你使用声明变量字符串时,那么

getline (cin,user_guest); //This is correct.

但是当你使用变量char时,那是另一个问题。您的getline将不适用。试着用这个:

char user_guest;
cin.get(user_request);

答案 4 :(得分:0)

您需要将字符串检索到缓冲区(而不是单个字符)。

请参阅:

http://www.cplusplus.com/reference/iostream/istream/getline/

答案 5 :(得分:0)

是std :: getline,获取输入流,以及std :: string或char *

您正在尝试传入一个字符,这就是您收到错误的原因。

FWIW,你可以使用带有std :: string的getline()。

答案 6 :(得分:0)

我会尝试替换

cin >> user_request;

cin >> user_string;
user_request= user_string[0];