2010-04-27 52 views
1

我有關於'新'運算符的簡單任務。我需要創建10個字符的數組,然後使用'cin'輸入這些字符。它應該看起來像這樣嗎? :使用「新」運算符

char c = new char[10]; 
for(int i=0; i < 10; i++) 
{ 
    cin >> char[i] >> endl; 
} 
+4

爲什麼你需要動態分配數組?爲什麼你使用'char'數組呢?這是你家庭作業要求的一部分嗎?否則,你應該使用'std :: string'來代替。如果沒有其他原因,那麼因爲所有答案到目前爲止都有__buffer overflow__正在等待被利用。 'std :: string'消除了這種危險。 – sbi 2010-04-27 07:30:42

回答

4

不需要endl。並且不要忘記delete []陣列末尾

+0

除非程序剛剛在上面給出的代碼後終止 – adhanlon 2010-04-28 01:41:25

2
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. 
+0

爲什麼不使用cin.width()?或者這裏沒有必要?爲什麼不在堆棧上分配? – Krab 2010-04-27 07:30:36

+0

這將溢出,並將停止閱讀空白。 – Potatoswatter 2010-04-27 18:35:09

5

的char [I]應該是C [1]

+0

和char C應該是char * c – Vijay 2010-04-27 08:53:36

1

更簡單的方法可能是:

char * c = new char[11]; 
cin >> c; 
+0

這會溢出,並停止讀取空格。 – Potatoswatter 2010-04-27 18:35:36

+0

@Patatoswatter:同意關於空格(在這個例子中可能不重要),但你爲什麼認爲它會溢出? – 2010-04-27 18:46:34

+0

如果您不假定在10個字符的序列中出現空白,則假設第11個字符是空格也是不安全的。 – Potatoswatter 2010-04-27 21:02:06

1

關閉。

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。

+1

ITYM「分隔符」? – 2010-04-27 07:34:54

+0

這就是我正在尋找的詞;) – mpen 2010-04-28 01:30:02

1

爲了解釋上面的答案,「char *」在那裏,因爲它表示「c」變量將是一個指針。您需要這樣做,因爲「新」會在堆中分配一些內存並返回一個指向它的指針。 「delete []」運算符用於釋放使用new運算符分配的內存,因此它對系統是可用的。方括號意味着您將釋放的指針指向一個數組,而不僅僅是一個大小爲sizeof(char)的內存應該被釋放,但是有一個數組應該被釋放completeley。

2

由於還沒有人做,我會建議你使用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個字符,那麼如果你是幸運的,整個事情立即炸燬。 (如果你不走運,一切似乎都會繼續工作,直到稍後出現一些「有趣」的錯誤,可能在你的代碼的看似無關的部分。)

+1

我想這將無法滿足作業分配的要求,但是,在大多數其他情況下肯定更喜歡std :: string over char *。 – meagar 2010-04-28 01:38:36