2017-04-21 18 views
-2

所以我使用cin來爲char數組輸入數據。Cin正在爲char數組工作,但不適用於int數組

char mycroft[2]; 
    cin>>mycroft; 
    cout<<mycroft; 

它工作正常。現在,我使用cin採取輸入一個int數組:

int mycroft[2]; 
    cin>>mycroft; 
    cout<<mycroft; 

不過,我得到這個錯誤,我不明白:

error: no match for 'operator>>' (operand types are 'std::istream {aka std::basic_istream}' and 'int [2]')|

有人能告訴我爲什麼它不工作?另外我的教授說,採用cin進行輸入是不可取的。在什麼程度上這是真的?

+0

這是因爲'char'數組被視爲舊的C風格*字符串*。沒有任何其他數組或指針的特殊處理。這當然意味着您的示例字符數組只能輸入單個字符。 –

+0

@Someprogrammerdude umm ...不是?我已經給出了「你好」這個詞,它起作用了! – Mark

+0

然後輸入運算符將寫入六個字符(不要忘記字符串終止符)到一個兩元素數組。它會寫出界限,你將有*未定義的行爲*。這就是爲什麼你應該總是使用'std :: string'來輸入字符串的原因! –

回答

0

你誤會char陣列和int(及其他)陣列的概念。

當您創建char variable[x]時,您將內存空間預留爲x * 8位(長度爲char),並且語言將其視爲連續空間。 要完成此鏈,您需要放置結束字符'\0'char mycroft[2]有1個可用的char(理論上)在內存中有16位(2 * 8位)空間。

在另一方面,當你創建一個int variable[x]你的內存預留空間x * 32位(的int長度),儘管該系統連續地分配它的語言對待每一個單獨的元素x。總之,把它當作真正的數組。 int mycroft[2]有2個可用的元素,並佔用64位(2 * 32位)的空間在內存中。

因爲這cin作品與char直接(cin >> mycroftcout << mycroft)和不工作,並與其他陣列(在你的情況int),你需要單獨(cin >> mycroft[position]cout << mycroft[position])訪問它們。

0

你可能需要:

for(i=0; i<2; i++) 
{ 
    cin>>mycroft[i]; 
... 
} 
+0

ummm ..這是最簡單的方法..但它..但我如何採取這種方式是需要更少的時間在競爭性編碼...我想我正在尋找一種方式使int方陣 – Mark

+0

我工作't瞭解 –

+0

@Mark學習編碼。然後學會競爭。反過來這樣做通常會教你編寫真正非常糟糕的代碼。例如,以編碼速度的名義,你在浪費不可能的時間。 – user4581301

0

由於字符數組可能意味着它是C風格的字符串(如果是零終止的,即數組中的最後一個元素爲零)。 std::coutstd::cin以這種方式對待它們。

char[]可以被初始化爲:

char mycroft[] = "Hello, World!"; 

int[]不能以這樣的方式被初始化,這是一個整數數組。您的教授告訴您,使用std::cin進行輸入不可取的原因是,如果您以錯誤的方式使用它,可能會導致溢出。在你的第一個例子中,std::cin將把輸入中的所有內容寫入一個兩個元素的長陣列中,導致內存跟在char mycroft[2]之後將被覆蓋。