问题是我想根据用户输入的大小动态分配内存。请注意,用户未指定输入的大小。我们必须计算它有多长时间,然后才为其分配确切的内存量。我正在寻找的是这样的东西:
char* input_str = NULL; // No initial size whatsoever
cout<<"\nEnter the string: ";
//Determine how long the string entered was, and allocate memory for it
//make input_str point to it.
也许这可以帮助我们编写我们的
std::string
版本? 最佳答案
据我了解的问题,尤其是“也许可以帮助我们编写std::string
的版本”,这是关于
做std::getline
标头中的<string>
做什么,以查看其中涉及的内容。
Bjarne Stroustrup在他的论文“Learning Standard C++ as a New Language”中已经对它进行了很好的讨论,除了Bjarne通过>>
运算符讨论输入,该运算符仅输入单个空格分隔的单词。
Bjarne从一个假设学生的练习的伪代码开始:
输入提示“请输入您的名字”
读名字
写出“你好”
然后,他提出了一种可能的C ++解决方案:
#include<iostream> // get standard I/O facilities
#include<string> // get standard string facilities
int main()
{
using namespace std; // gain access to standard library
cout << "Please enter your first name:\n";
string name;
cin >> name;
cout << "Hello " << name << '\n';
}
经过一番讨论,他提出了一个C风格的解决方案,一个DIY C风格的程序,其功能与C ++风格的解决方案几乎相同:
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
void quit() // write error message and quit
{
fprintf(stderr," memory exhausted\n") ;
exit(1) ;
}
int main()
{
int max = 20;
char* name = (char*) malloc(max) ; // allocate buffer
if (name == 0) quit();
printf("Please enter your first name:\n");
while (true) { // skip leading whitespace
int c = getchar();
if (c == EOF) break; // end of file
if (!isspace(c)) {
ungetc(c,stdin);
break;
}
}
int i = 0;
while (true) {
int c = getchar() ;
if (c == '\n' || c == EOF) { // at end; add terminating zero
name[i] = 0;
break;
}
name[i] = c;
if (i== max-1) { // buffer full
max = max+max;
name = (char*)realloc(name, max) ; // get a new and larger buffer
if (name == 0) quit() ;
}
i++;
}
printf("Hello %s\n",name);
free(name) ; // release memory
return 0;
}
这两个程序并不完全等效:C ++样式的第一个程序仅读取输入的单个“单词”,而C程序跳过空格,然后读取完整的输入行。但这说明了自己执行此操作涉及的内容。简而言之,最好使用C ++样式。 ;-)
关于c++ - 根据用户输入的大小为字符数组动态分配内存-无需malloc,realloc,calloc等,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29674932/