这是我的代码:
...
...
do
{
cin >> command;
switch(command)
{
case 'i':
cin >> key >> nome >> idade >> endereco;
count++;
pessoas = (Pessoa **) realloc(pessoas, count*sizeof(Pessoa *));
pessoas[count-1] = new Pessoa(key, nome, idade, endereco);
bTree->add(pessoas[count-1]);
break;
case 's':
cin >> key;
toSearch = (Pessoa *) bTree->search(key);
if(toSearch == NULL)
{
cout << "-1" << endl;
}
else
{
cout << key << endl;
cout << toSearch->getNome() << endl;
cout << toSearch->getIdade() << endl;
cout << toSearch->getEndereco() << endl;
}
break;
case 'e':
done = true;
break;
}
} while(!done);
...
...
我有一个&#34;菜单&#34;当我输入i
时,它会插入BTree,s
将搜索,e
将退出该计划。
问题是,当我点击i
进行插入时,我必须提供四个参数:
当我给出一个内有e
字符的名称时(例如,#34; James&#34;),它将退出程序。
当我在交换机上读取stdin缓冲区时,如何避免command
读取stdin缓冲区?
示例输入:
i
1
Joao da Silva 1
11
Rua 2, 3
i
2
Joao da Silva 2
12
Rua 4, 6
s
1
s
7
e
感谢。
答案 0 :(得分:0)
std::basic_istream::get
(定义1)怎么样?
这会使你的switch语句开始如下。
do
{
switch(cin.get())
{
请记住,在一般情况下switch
早期检查std::char_traits::eof
可能是谨慎的(虽然stdin不需要)。
答案 1 :(得分:-1)
使用fgetc
:
...
...
while(!done)
{
cin >> command;
switch(command)
{
case 'i':
scanf("%d\n", &key);
strCounter = 1;
while(true)
{
buff = fgetc(stdin);
// until the user types '\n'
if(buff == '\n')
{
nome[strCounter-1] = '\0';
break;
}
// realloc it
nome = (char *) realloc(nome, (strCounter)*sizeof(char));
nome[strCounter-1] = buff;
strCounter++;
}
scanf("%d\n", &idade);
strCounter = 1;
while(true)
{
buff = fgetc(stdin);
// until the user types '\n'
if(buff == '\n')
{
endereco[strCounter-1] = '\0';
break;
}
// realloc it
endereco = (char *) realloc(endereco, (strCounter+1)*sizeof(char));
endereco[strCounter-1] = buff;
strCounter++;
}
count++;
pessoas = (Pessoa **) realloc(pessoas, count*sizeof(Pessoa *));
pessoas[count-1] = new Pessoa(key, nome, idade, endereco);
bTree->add(pessoas[count-1]);
break;
case 's':
cin >> key;
toSearch = (Pessoa *) bTree->search(key);
if(toSearch == NULL)
{
cout << "-1" << endl;
}
else
{
cout << key << endl;
cout << toSearch->getNome() << endl;
cout << toSearch->getIdade() << endl;
cout << toSearch->getEndereco() << endl;
}
break;
case 'e':
done = true;
break;
default:
break;
}
}
...
...