如何使用c-strings并避免溢出c ++

csS*_*ent 0 c++ c-strings

如何使用c-string并避免溢出?例如,如果我有代码:

#include <iostream>
using namespace std;

int main()
{
    int size = 1000;
    char * name = new char[size];
    getline(cin, name);
}
Run Code Online (Sandbox Code Playgroud)

我不知道这个人的名字会有多长,所以你怎么避免溢出?如果我作为预防措施分配1000,他们可以轻松输入1001个字符.我该怎么做才能阻止这种情况发生?

编辑:我必须能够在没有字符串类的情况下执行此操作

Mat*_*jek 5

有一个版本std::getline()接受std::string作为目标缓冲区.它旨在利用std::string自动调整大小功能并防止溢出.std :: getline联机帮助页的示例:

#include <string>
#include <iostream>

int main()
{
    // greet the user
    std::string name;
    std::cout << "What is your name? ";
    std::getline(std::cin, name);
    std::cout << "Hello " << name << ", nice to meet you.\n";
}
Run Code Online (Sandbox Code Playgroud)

除了您所询问的安全性之外,std::string还提供自动内存管理 - 因此您无需记住delete任何内容,这在您的示例中是必需的.


如果您不被允许使用std::string,您可以使用std::basic_istream::getline,它有两种形式:

basic_istream& getline( char_type* s, std::streamsize count );
basic_istream& getline( char_type* s, std::streamsize count, char_type delim );
Run Code Online (Sandbox Code Playgroud)

它允许您指定要读取的最大字符数和可选的分隔符.std::basic_istream是基类std::istream.这个类的一个非常流行的例子是std::cin.

所以基本上,你可以这样做:

char target[64];
std::cin.getline(target, 64);
Run Code Online (Sandbox Code Playgroud)