LINUX.ORG.RU

C++: Укрощение getchar()


0

0

Простейший код, но работает не так, как хотелось бы. Уже убил полчаса на поиски истины.

Если я ввожу одну букву(кроме q), весь цикл повторяется дважды, не спрашивая меня ни о чём. Если две, то цикл while повторяется трижды, не запрашивая меня нажать ENTER. С cin.get, cin.getline та же история. cin не предлагать, т.к. он ждёт, пока не введёшь что-нибудь перед нажатием ENTER.

#include <iostream>
#include <stdio.h>
#include "dice.h"
using std::cout;
using std::endl;
using std::cin;

int main(int argc, char *argv[]) {
	Dice dice[3];
	char c;
	while(true){
		cout << "Press ENTER to throw " << Dice::numOfDices << " dices (q for exiting): ";
		if((c=getchar()) == 'q'){
			break;
		}else{
			for(unsigned int i=0; i< Dice::numOfDices; i++) {
				dice[i].throwNow();
				cout << "Dice#" << i+1 << " has " << dice[i].getCurrentNumber() << endl;
			}
		}
	}
	return 0;
}
/*
Press ENTER to throw 3 dices (q for exiting): :)
Dice#1 has 4
Dice#2 has 3
Dice#3 has 3
Press ENTER to throw 3 dices (q for exiting): Dice#1 has 5
Dice#2 has 1
Dice#3 has 4
Press ENTER to throw 3 dices (q for exiting): Dice#1 has 4
Dice#2 has 3
Dice#3 has 2
Press ENTER to throw 3 dices (q for exiting):
*/
★★★★

идиотизм какой-то: используй либо iostream либо stdio, начерта оба?

anonymous
()

/**
* Мне раскрыли глаза
*/

#include <iostream>
#include <string>
#include "dice.h"
using std::cout;
using std::endl;
using std::cin;
using std::string;

int main(int argc, char *argv[]) {
	Dice dice[3];
	string line;
	while(true){
		cout << "Press ENTER to throw " << Dice::numOfDices << " dices (q for exiting): ";
		getline(cin, line);
		if(line == "q"){
			break;
		}else{
			for(unsigned int i=0; i< Dice::numOfDices; i++) {
				dice[i].throwNow();
				cout << "Dice#" << i+1 << " has " << dice[i].getCurrentNumber() << endl;
			}
		}
	}
	return 0;
}

Selecter ★★★★
() автор топика
Ответ на: комментарий от Selecter

Может не доконца понял смысл, а не проще чем while (true) сделать while(getchar()!='q') ? А то как-то кашеобразно получается ....

voiD
()
Ответ на: комментарий от voiD

Дело в том, что надо выводить строчку в любом случае: cout << "Press ENTER to throw " << Dice::numOfDices << " dices (q for exiting): ";

Selecter ★★★★
() автор топика

бредовый какой то код. и вообще признаком окончания ввода должен быть конец файла, а не какой-то левый символ 'q'. все программы должны вести себя единообразно. фтопку велосипеды...

anonymous
()

и ещё: по стандарту ISO надо писать <cstdio>, а не <stdio.h>

anonymous
()
Ответ на: комментарий от Selecter

Ой. Не обратил внимания. <cstdio> soobib

Selecter ★★★★
() автор топика
Ответ на: комментарий от Selecter

>q for exiting, балбес!

хамите, парниша (c)

в качестве домашнего задания предлагаю подумать над тем, что будет если вдруг понадобится на стандартный ввод твоей программы подать вывод какой-либо third party программы, которая, вообще говоря, не обязана знать о том, что признаком конца ввода в твоей программе является символ 'q'.

кстати, ещё: у тебя в программе есть кусок

char c; if ((c = getchar()) == 'q')

советую покурить man 3 getchar на предмет возвращаемого значения

anonymous
()
Ответ на: комментарий от Selecter

>Дело в том, что надо выводить строчку в любом случае: cout << "Press ENTER to throw " << Dice::numOfDices << " dices (q for exiting): ";

хех... используй do{...}while(...)

php-coder ★★★★★
()
Ответ на: комментарий от anonymous

>советую покурить man 3 getchar на предмет возвращаемого значения

Ага, ЕМНИП она возвращает integer

php-coder ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.