2010-04-27 53 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