我是c ++的新手,我正在尝试编写一个程序,从main方法到case-choice,再到第二个带if-choice的方法。
但是在打印出文本后,第二个cin
被跳过并且程序Lobby中的程序退出。
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
void Char();
void Lobby();
void Status();
void Test();
int i;
char c;
char pcharchoice;
int money;
char pname;
int main() {
cout << "$$ Test $$\n";
Char();
}
void Char(){
cout << "Select :\n";
cout << "1 : Test1 \n";
cout << "2 : Test2 \n";
cin >> pcharchoice;
cout << "\n";
switch (pcharchoice) {
case '1':
money = 1000;
break;
case '2':
money = 2500;
break;
default:
exit(0);
break;
}
cout << "Select a Name:\n";
cin >> pname;
Lobby();
}
void Lobby(){
i = 0;
cout << "What would do ? \n";
cout << "1 : Status \n";
cout << "2 : Test \n";
cout << "3 : Leave \n";
cin >> i;
cout << "\n";
if( i == 1 ) {
Status();
} else if( i == 2 ){
Test();
} else if ( i == 3 ){
cout << "Quit\n";
}
}
void Status(){
cout << "** Status **\n";
//TODO
}
void Test(){
cout << "** Test **\n";
//TODO
}
答案 0 :(得分:3)
使用std::cin
和>>
运算符阅读字符时,您会读取一个字符。问题是您输入两个输入字符:实际字符和用于终止当前输入的换行符。
该换行符仍在输入缓冲区中,您读取的下一个字符将是该换行符。这是因为读取单个字符会读取输入缓冲区中的确切字符,它不会跳过空格。
有两种简单的方法可以解决这个问题,还有两种更复杂的方法。第一种简单的方法是不读取字符,而是读取字符串,因为输入操作符>>
将跳过前导空格,例如换行符。
第二个简单的解决方案是使用the std::skipws
I/O manipulator来告诉输入流跳过所有空格:
cin >> skipws >> pcharchoice;
如果您只是想要角色并且不希望用户输入任何问题,那么这就是我推荐的解决方案。
第一个更复杂的方法是使用std::istream::ignore
函数跳过换行符:
cin >> pcharchoice;
cin.ignore((numeric_limits<streamsize>::max(), '\n');
这个解决方案有一个很大的优势,它不仅会跳过空白区域,直到它通过行尾,它还会跳过用户在同一行上给出的任何额外输入。
第二个更复杂的方法是将整行读入一个字符串,然后从该行中获取字符(通过使用字符串的索引0
,或者使用std::istringstream
和&#34;普通&#34;格式化输入运算符)。