最近在做实习的Demo时,遇到了一个问题。

std::string commond;
	char task_flag;
	printf("             -----------(普通用户)指令表-------------\n");
	printf("                     指令号  功能 \n");
	printf("                       0: 查询余额\n");
	printf("                       1: 查询合约\n");
	printf("                       2: 查询持仓\n");
	printf("                       3: 开始交易\n");
	printf("                       4: 退出\n");
	printf("                       请输入指令号:");
	std::cin >> task_flag;
	fflush(stdin);
	switch (task_flag) {
	case '0':
		commond = "find_money";
		printf("查询余额\n");
		break;
	case '1':
		commond = "find_contract";
		printf("查询合约\n");
		break;
	case '2':
		commond = "hold_position";
		printf("查询持仓\n");
		break;
	case '3':
		commond = "bidding";
		printf("开始交易\n");
		break;
	case '4':
		commond = "exit";
		printf("已退出\n");
		break;
	default:
		commond = "erro";
		printf("非合法操作·········\n");
		break;
	}
	return commond;

  主要就是输入的如果是字符串的话,这段代码会重复输出几次(取决于字符串的长度),因为cin是流.

注意:只有在输入完数据再按回车键后,该行数据才被送入键盘缓冲区,形成输入流,提取运算符“>>”才能从中提取数据。需要注意保证从流中读取数据能正常进行。

如果把task_flag 改成字符串,就没有这个问题,如果改成数字,那循环次数是随机的。

在cin>>task_flag;之后加一句  fflush(stdin);清空键盘缓冲区,就是只让头一个字符赋值给了task_flag,其他的没有机会,直接清空了。

基础没打好,还是思维盲点呢?

-------------------------------------------------------------------------

ps:

int main(void) {


	char c;
	cin >> c;
	while (c != 'x'){
		cout << c << endl;
		cin >> c;
		
	}
	system("pause");
	return 0;
}

  cin 代表从缓冲区读了几个字符,这里是读了一个字符,如果你输入abcx,那么会打印出

a
b

c

以前之所以没遇到这个问题,是因为cin用的比较简单也比较固定,就是输入一个数字或字符串,现在是字符流,问题凸显了。