我有關於'新'運算符的簡單任務。我需要創建10個字符的數組,然後使用'cin'輸入這些字符。它應該看起來像這樣嗎? :使用「新」運算符
char c = new char[10];
for(int i=0; i < 10; i++)
{
cin >> char[i] >> endl;
}
我有關於'新'運算符的簡單任務。我需要創建10個字符的數組,然後使用'cin'輸入這些字符。它應該看起來像這樣嗎? :使用「新」運算符
char c = new char[10];
for(int i=0; i < 10; i++)
{
cin >> char[i] >> endl;
}
編號嘗試char* c = new char[10];
。
char *c = new char[11]; // c should be a pointer.don't forget space for null char.
// do error checking.
cin >> c; // you can read the entire char array at once.
cout<<c<<endl; // endl should be used with cout not cin.
delete[]c; // free the allocated memory.
爲什麼不使用cin.width()?或者這裏沒有必要?爲什麼不在堆棧上分配? – Krab 2010-04-27 07:30:36
這將溢出,並將停止閱讀空白。 – Potatoswatter 2010-04-27 18:35:09
更簡單的方法可能是:
char * c = new char[11];
cin >> c;
這會溢出,並停止讀取空格。 – Potatoswatter 2010-04-27 18:35:36
@Patatoswatter:同意關於空格(在這個例子中可能不重要),但你爲什麼認爲它會溢出? – 2010-04-27 18:46:34
如果您不假定在10個字符的序列中出現空白,則假設第11個字符是空格也是不安全的。 – Potatoswatter 2010-04-27 21:02:06
關閉。
char *c = new char[10];
for(int i=0; i < 10; i++)
{
cin >> c[i];
}
// free the memory here somewhere
更好的是,如果你不真的需要一個指針....不要使用一個。那麼你不必擔心內存泄漏。 (必須提及智能指針?)
char c[10];
for(int i=0; i < 10; i++)
{
cin >> c[i];
}
或......正如別人提到的那樣......一次讀完整個10個字符。與不同的是,解決方案空間被接受,cin >> c
空間被視爲分隔符IIRC。
ITYM「分隔符」? – 2010-04-27 07:34:54
這就是我正在尋找的詞;) – mpen 2010-04-28 01:30:02
char c[10];
cin.get(c, 10);
爲了解釋上面的答案,「char *」在那裏,因爲它表示「c」變量將是一個指針。您需要這樣做,因爲「新」會在堆中分配一些內存並返回一個指向它的指針。 「delete []」運算符用於釋放使用new運算符分配的內存,因此它對系統是可用的。方括號意味着您將釋放的指針指向一個數組,而不僅僅是一個大小爲sizeof(char)的內存應該被釋放,但是有一個數組應該被釋放completeley。
由於還沒有人做,我會建議你使用std::string
代替:
std::string word;
std::cin >> word; // reads everything up to the first whitespace
或
std::string line;
std::getline(std::cin,line);
使用std::string
的優點是,它會自動膨脹,消除緩衝區溢出。相反,如果你處理的裸字符緩衝區
void f()
{
char buffer[10];
std::cin >> buffer;
//
}
,有人走來,進入超過10個字符,那麼如果你是幸運的,整個事情立即炸燬。 (如果你不走運,一切似乎都會繼續工作,直到稍後出現一些「有趣」的錯誤,可能在你的代碼的看似無關的部分。)
我想這將無法滿足作業分配的要求,但是,在大多數其他情況下肯定更喜歡std :: string over char *。 – meagar 2010-04-28 01:38:36
爲什麼你需要動態分配數組?爲什麼你使用'char'數組呢?這是你家庭作業要求的一部分嗎?否則,你應該使用'std :: string'來代替。如果沒有其他原因,那麼因爲所有答案到目前爲止都有__buffer overflow__正在等待被利用。 'std :: string'消除了這種危險。 – sbi 2010-04-27 07:30:42