如何使用 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_istream
是 std::istream
的基础 class。 class 的一个非常流行的例子是 std::cin
.
基本上,你可以这样做:
char target[64];
std::cin.getline(target, 64);
如何使用 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_istream
是 std::istream
的基础 class。 class 的一个非常流行的例子是 std::cin
.
基本上,你可以这样做:
char target[64];
std::cin.getline(target, 64);