簡體   English   中英

使用 cin.get() 初始化字符數組

[英]char array initialization using cin.get()

我正在嘗試與cin.get()不同的東西,如下所示:

char chArray[30]="character array with size "; //current string size is 25 character with null character
cout<< chArray << sizeof(chArray)<< endl;
cout<< "Now we will try to enter more than 30 character in chArray using cin.get()";
cin.get(chArray,100);
cout<< chArray << endl << sizeof(chArray)<< endl;

上面代碼的 output 很奇怪,如下所示:

大小為 30 的字符數組

現在我們將嘗試使用cin.get()chArray中輸入超過 30 個字符。

字符數組大小為 30,但我們使用cin.get()輸入的字符數超過 30,但大小仍為 30。

chArray的大小如何不會從 30 變為我們使用cin.get()輸入的字符串的大小?

請解釋。

固定數組不是動態大小的。 一旦聲明了數組,它就不能改變大小( sizeof()在編譯時是固定的)。 如果您嘗試輸入的字符數超過數組可以容納的字符數,您的代碼會出現緩沖區溢出,這將破壞 memory 周圍的內容。 在您的示例中,您的數組最多只能容納 30 個char ,但您告訴cin最多可以將100 個char (嗯,99 個,加上一個 null 終止符)讀入數組。

對於您要執行的操作,您需要讀入std::string而不是char[]數組。 std::stringsize()可以在運行時動態變化,例如:

#include <string>

std::string str = "character string with size ";
std::cout << str << str.size() << std::endl;
std::cout << "Now we will try to enter more than 30 character in str using cin";
std::cin >> str; // or: std::getline(std::cin, str);
std::cout << str << std::endl << str.size() << std::endl;

chArray 的大小如何不會從 30 變為我們使用 cin.get() 輸入的字符串的大小?

C++ 中的 Arrays 具有固定大小。 它們以程序員給定的固定大小在堆棧上創建。 這意味着你給它們一個特定的大小,編譯器在編譯時就知道了。 這個大小不會改變。 曾經。

如果您向數組中寫入的字符多於大小,例如在大小為 30 的數組中寫入 100 個字符,則稱為緩沖區溢出緩沖區溢出。 這基本上意味着您越過了邊界,即固定大小集,在本例中為 30。

輸入的其他字符(在 30 個限制之后)可以在 memory 中的任何位置進行 go,因為它們將在 go 的位置未定義。 如果您嘗試打印此數組,您的程序將因錯誤而終止:

*** stack smashing detected ***: terminated

這種特殊情況下的錯誤意味着您嘗試將比其容量更多的數據放入堆棧。

但是,我們在 C++ 中有string ,如果您想要一個根據需要更改其大小的容器,您可以使用它。 例子:

std::string mystr;
std::cout << "Mystr size before: " << mystr.size() << '\n';
std::getline (std::cin, mystr);
std::cout << "Mystr size after: " << mystr.size() << '\n';

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM