问题是我想根据用户输入的大小动态分配内存。请注意,用户未指定输入的大小。我们必须计算它有多长时间,然后才为其分配确切的内存量。我正在寻找的是这样的东西:

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/

10-13 08:33
查看更多