C++ C++;将字符串输入存储为cstring

C++ C++;将字符串输入存储为cstring,c++,getline,cstring,C++,Getline,Cstring,我正在做一个作业,第一部分要求我们提示用户输入字符串。我们需要将此输入存储为堆上的cstring(而不是std::string),以便更好地理解cstring。我有一些很好用的东西: char *input = new char[500]; cout << "enter a string: "; cin.getline(input, 500); char*input=新字符[500]; coutC方法是使用malloc分配缓冲区,读取适当的字节数,并确定是否得到整个字符串。如果您读

我正在做一个作业,第一部分要求我们提示用户输入字符串。我们需要将此输入存储为堆上的cstring(而不是std::string),以便更好地理解cstring。我有一些很好用的东西:

char *input = new char[500];
cout << "enter a string: ";
cin.getline(input, 500);
char*input=新字符[500];

coutC方法是使用malloc分配缓冲区,读取适当的字节数,并确定是否得到整个字符串。如果您读得不够多,那么可以使用realloc扩展缓冲区,并在您停止的地方阅读更多内容。

我们可以这样做:自己构建动态字符串缓冲区

  • 分配堆内存(80就足够了)
  • 您可以自己控制输入。您只能从输入中读取一个字符 每次流。如果内存大小不足以 包含此字符,只需分配另一个足够的字符
  • 当您得到字符“\n”(或其他)时,请停止阅读

  • 是的,这就是C++库所做的!缓冲区实际上是一个队列。

    c++提高了性能。。。这将获取一个数组,并用指针指向该数组

    #include <cstring>
    #include <iostream>
    #include <string>
    #include <stdio.h>
    using namespace std;
    
    int main()
    {
    char name[100];
    //string userInput[26];
    int i=0, n=0;
    cout<<"your name? ";
    cin>>name;
    cout<<"Hello "<<name<< endl;
    
    char *ptr=name;
    for (i = 0; i < 20; i++)
    {
    cout<<i<<" "<<ptr[i]<<" "<<(int)ptr[i]<<endl;
    }   
    int length = 0;
    while(name[length] != '\0')
    {
        length++;
        }
    
                for(n=0; n<3; n++)
                        {
    
                    if (strncmp(ptr, "r2d2", 4) == 0)
                        {
                        cout << "you found r2d2bob" << ptr[i];
                        }
    
            }
    cout<<name <<"is"<<length<<"chars long";
    }
    
    #包括
    #包括
    #包括
    #包括
    使用名称空间std;
    int main()
    {
    字符名[100];
    //字符串userInput[26];
    int i=0,n=0;
    coutname;
    
    如果您不指定大小,堆如何知道它应该为您的字符分配多少空间?它将在此处为500个字符分配空间,并确保此空间不会被其他应用程序占用。
    std::string
    的方法可能是分配一个较小的缓冲区,然后在填充后重新分配和复制s up,并且可能重复和重新分配多次,直到没有更多的字符可读取。您可以这样实现它,但不值得这么麻烦。现在500字节的空间不太大。
    std::string
    会自动调整自身大小以适应,因此显然它会更易于使用。一般来说你所做的是关于你在不知道输入大小的情况下能做得多好,从而更精确。如果你想节省整体空间,你可以填充你的缓冲区,然后找到它的大小,并制作另一个正好相同大小的数组,将你的缓冲区复制到该数组,然后释放缓冲区。你必须检查
    failbit
    如果已设置,则启动一个新的缓冲区。
    std::string
    可能会执行类似操作。如果知道输出可能很大,则使用
    std::string
    reserve
    方法。