我有关于'新'运算符的简单任务。我需要创建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