2013-06-28 56 views
0
#include <iostream> 
using namespace std; 

const int Max=20; 

struct bop 
{ 
    char fullname[Max]; 
    char title[Max]; 
    char bopname[Max]; 
    int preference; 
}; 

int main() 
{ 
    bop a[5]= 
    { 
     {"Steve Jobs", "BFF", "Rita",0}, 
     {"Bill Gates", "BFF2", "Ann",1}, 
     {"Mark", "BFF3", "Boss", 2}, 
     {"Edward", "BFF4", "Jiezha", 2}, 
     {"Larry Page", "BFF5", "Michele", 1} 
    }; 
    cout << "Benevolent Order of Programmers Report\n"; 
    cout << "a. display by name   b. display by title\n" 
      "c. display by bopname  d. display by preference\n" 
      "q. quit\n" 
      "Enter your choice: "; 
    char ch; 
    (cin >> ch).get(); 
    int i; 
    while (ch!='q') 
    { 
     switch (ch) 
     { 
      case 'a': for (i=0; i<Max; i++) cout << a[i].fullname << endl; break; 
      case 'b': for (i=0; i<Max; i++) cout << a[i].title << endl; break; 
      case 'c': for (i=0; i<Max; i++) cout << a[i].bopname << endl; break; 
      case 'd': for (i=0; i<Max; i++) 
         switch (a[i].preference) 
         { 
          case 0: cout << a[i].fullname << endl; break; 
          case 1: cout << a[i].title << endl; break; 
          case 2: cout << a[i].bopname << endl; break; 
         } 
         break; 
     } 
     cout << "Next choice: "; 
     (cin >> ch).get(); 
    } 
    cout << "Bye!" << endl; 
    return 0; 
} 

此程序會顯示大量垃圾如下:簡單的C++控制檯I/O問題

Benevolent Order of Programmers Report 
a. display by name   b. display by title 
c. display by bopname  d. display by preference 
q. quit 
Enter your choice: a 
Steve Jobs 
Bill Gates 
Mark 
Edward 
Larry Page 
^?&i? 
'=YV? 
K>YV? 
f?YV? 
??YV? 
xterm-256color 
11dry7st9vkb200000gn/T/ 
T3PDw/Render 
anguage (C++) 
B6 
qUSg/Listeners 
Message=/tmp/launch-Gpgr3C/Apple_Ubiquity_Message 
/bin:/usr/sbin:/sbin:/usr/local/bin 
ge (C++)/cpp 
boris 
Next choice: 

可有人向我解釋原因,並告訴我如何糾正這一計劃?我也嘗試用cin >> ch替換(cin >> ch).get()。它也不起作用。非常感謝!

+0

如果你正在編寫C++,然後使用std :: string和std :: vector。一旦你瞭解了STL,你就會體會到它提供的優勢。但是,這並不意味着你只需跳過數組。一旦你真正理解了數組和指針,移動到STL。 –

+0

@ScepticalJule非常感謝您的建議! – user1050165

回答

1

問題出在你的內部實現中。你做到以下幾點:

case 'a': for (i=0; i<Max; i++) cout << a[i].fullname << endl; break; 
//case 'b': ... 

如果你頂一下,最大的定義爲20:

const int Max=20; 

但你的陣列只中有5名成員:

bop a[5]= 
{ 
    {"Steve Jobs", "BFF", "Rita",0}, 
    {"Bill Gates", "BFF2", "Ann",1}, 
    {"Mark", "BFF3", "Boss", 2}, 
    {"Edward", "BFF4", "Jiezha", 2}, 
    {"Larry Page", "BFF5", "Michele", 1} 
}; 

所以當它打印索引6-19的值時,它會打印垃圾。計算垃圾行數加上正確輸出的行數。完美20.

+0

可以指定一個'最後/空數組元素'規範作爲例如這樣的情況。 '{NULL,NULL,NULL,-1}' –

+0

Err ...我不得不承認這純粹是一個粗心的錯誤。順便說一句,你能告訴我爲什麼用cin >> ch替換(cin >> ch).get()根本沒有任何作用?如果我使用cin >> ch;並輸入一個字符和一個換行符,不是換行的字符,可以在下一個字符中讀取>> ch ;? – user1050165

+0

我發現cin >> ch;將永遠不會讀取空格。謝謝! – user1050165

1

它看起來像你迭代超出數組的界限。爲什麼你迭代到20(MAX)?相反,您應該重複5次。

此外,你應該在你的問題中包括你的預期輸出是什麼。

+0

+1這表明問題和解決方案非常好! –

+0

這是一個非常粗心的錯誤。謝謝! – user1050165