如何使用 C 字符串并避免溢出 C++

How to use c-strings and avoid overflow c++

如何使用 C 字符串并避免溢出?例如,如果我有代码:

#include <iostream>
using namespace std;

int main()
{
    int size = 1000;
    char * name = new char[size];
    getline(cin, name);
}

我不知道那个人的名字要多长,所以你如何避免溢出?如果我分配 1000 作为预防措施,他们可以轻松输入 1001 个字符。我能做些什么来阻止这种情况发生?

编辑:我必须能够在没有字符串 class

的情况下执行此操作

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

#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";
}

除了您询问的安全性之外,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 );

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

基本上,你可以这样做:

char target[64];
std::cin.getline(target, 64);