2014-04-06 58 views
0

讀到這裏是我的代碼:從標準的C++

... 
... 
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); 
... 
... 

我有一個「菜單」,當我進入i,它將在B樹插入,s將搜索和e將退出程序。

的問題是,當我打i插入,我得給四個參數:

  1. (INT)鍵;
  2. (字符串)名稱;
  3. (int)年齡;
  4. (字符串)地址;

當我給一個內部有e字符的名字(例如「James」)時,它將退出程序。

如何避免command讀取標準輸入緩衝區,而我在開關上讀取它?

樣品輸入:

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 

感謝。

+2

你不使用'的std :: VECTOR'爲'pessoas'任何理由嗎? – Deduplicator

+0

這與我的問題有什麼關係? 如果我只需要realloc,爲什麼會浪費堆棧? –

+0

還沒有發現任何錯誤,只是想知道爲什麼你不在那裏寫慣用的C++。 – Deduplicator

回答

0

std::basic_istream::get(定義1)?

這會讓你的switch語句開始如下。

do 
{  
    switch(cin.get()) 
    { 

請記住它可能是謹慎的在通常情況下,檢查std::char_traits::eofswitch早期(儘管它不應該對標準輸入是必要的)。

+0

幾乎沒有,現在不起作用... –

+1

這可能是EOF的情況。在shell中使用'<'可以將stdin綁定到文件,因此EOF是一個問題。 –

+0

也許是因爲我在'cin'上使用空格? –

-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; 
    } 
} 
... 
...