如何使用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个字符.我该怎么做才能阻止这种情况发生?
编辑:我必须能够在没有字符串类的情况下执行此操作
有一个版本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)