C++ 字符数组的长度限制

C++ 字符数组的长度限制,c++,arrays,C++,Arrays,我的问题围绕下面所示的程序展开(环境是MacXcode) #包括 int main(){ char-nameOne[5]; std::cin>>nameOne;//输入:BillyBobThorton std::cout它并没有“表面上扩展”,而是安全地通过了数组的边界,结果会导致内存损坏 有一些“安全”功能可以限制用户输入的长度。请查看带有长度限制器的scanf(%xxxs其中xxx是最大长度)或Windows上的scanf。它不是“表面上扩展”,而是不安全地通过数组的边界,可能并将导致内存损

我的问题围绕下面所示的程序展开(环境是MacXcode)

#包括
int main(){
char-nameOne[5];
std::cin>>nameOne;//输入:BillyBobThorton
std::cout它并没有“表面上扩展”,而是安全地通过了数组的边界,结果会导致内存损坏

有一些“安全”功能可以限制用户输入的长度。请查看带有长度限制器的scanf(
%xxxs
其中xxx是最大长度)或Windows上的scanf。

它不是“表面上扩展”,而是不安全地通过数组的边界,可能并将导致内存损坏

有一些“安全”功能可以限制用户输入的长度。请查看带有长度限制器的scanf(
%xxxs
其中xxx是最大长度)或Windows上的scanf。

是否有更合适的方法将用户输入存储到字符数组中?

是的!C++中最合适的方法是使用。这将阻止用户超过已分配的缓冲区的末尾并损坏堆栈。如果只想显示一定数量的字符,则可以限制输出(或在某些验证例程中使用)。这里有一个例子。

#include <iostream>
#include <string>

int main ()
{
    std::string nameOne;
    std::cin >> nameOne; // input: BillyBobThorton
    std::cout << nameOne.substr(0, 5); // output: Billy

    const std::string nameTwo = "BillyBobThorton";
    std::cout << nameTwo.substr(0, 5); // output: Billy
    return 0;
}
#包括
#包括
int main()
{
std::stringnameone;
std::cin>>nameOne;//输入:BillyBobThorton
有没有更合适的方法将用户输入存储到字符数组中?

是的!C++中最合适的方法是使用。这将阻止用户超过已分配的缓冲区的末尾并损坏堆栈。如果只想显示一定数量的字符,则可以限制输出(或在某些验证例程中使用)。这里有一个例子。

#include <iostream>
#include <string>

int main ()
{
    std::string nameOne;
    std::cin >> nameOne; // input: BillyBobThorton
    std::cout << nameOne.substr(0, 5); // output: Billy

    const std::string nameTwo = "BillyBobThorton";
    std::cout << nameTwo.substr(0, 5); // output: Billy
    return 0;
}
#包括
#包括
int main()
{
std::stringnameone;
std::cin>>nameOne;//输入:BillyBobThorton

std::coutstd::cin在使用运算符>>(char*)时不知道缓冲区的大小。它只知道必须从给定地址开始填充char数组。当它填充char*时,它读取输入,直到遇到新行(\n)

如果要读取用户作为输入提供的任何内容,可以使用std::string而不是char数组(std::cin>>string;或std::getline(std::cin,string);也可以从输入缓冲区中删除新行)

如果要限制要读取的字符数,应使用std::cin.get(char*,size)或std::cin.get(streambuf&,size)


最好限制输入长度,以避免读取很长的字符串(几千个字符或更多)。

std::cin在使用运算符>>时不知道缓冲区的大小(字符*)。它只知道必须从给定地址开始填充字符数组。当它填充字符*时,它将读取输入,直到遇到新行(\n)

如果要读取用户作为输入提供的任何内容,可以使用std::string而不是char数组(std::cin>>string;或std::getline(std::cin,string);也可以从输入缓冲区中删除新行)

如果要限制要读取的字符数,应使用std::cin.get(char*,size)或std::cin.get(streambuf&,size)

<> P>最好限制输入长度以避免读取一个非常长的字符串(几千个字符或更多)。C++中最合适的方法是使用STD::string。 在此基础上,无论缓冲区的大小,从cin流到固定大小的缓冲区几乎总是不好的做法。这就是导致臭名昭著的原因。来自标准输入的数据可以是任意长度的,您应该始终检查您要复制到的缓冲区是否足够大,以容纳您想要放入的任何内容去吧

当您使用std::cin和std::string时,检查缓冲区是否足够大,以及根据需要重新分配缓冲区,这一切都由您负责

当然,有一种方法来限制CIN的多少,参见

C++中最合适的方法是使用STD::string。 在此基础上,无论缓冲区的大小,从cin流到固定大小的缓冲区几乎总是不好的做法。这就是导致臭名昭著的原因。来自标准输入的数据可以是任意长度的,您应该始终检查您要复制到的缓冲区是否足够大,以容纳您想要放入的任何内容去吧

当您使用std::cin和std::string时,检查缓冲区是否足够大,以及根据需要重新分配缓冲区,这一切都由您负责


也就是说,当然有一种方法可以限制cin的提取量,请参见
只告诉编译器要分配多少内存。当您在边界外写入时,您只需覆盖存储在内存中与保留空间相邻的内容。但是,
cout
不知道您为字符串分配了多少内存,因此
std::cout-Yup.
[5]
只告诉编译器要分配多少内存。当您在边界外写入时,您只需覆盖存储在内存中与保留空间相邻的内容。但是,
cout
不知道您为字符串分配了多少内存,因此
std::cout我的本课程讲师不希望我们这样做e
std::string
,我可能应该在前面提到。但是,在了解缓冲区溢出后,我发现
cin.get(name,4)
非常适合我的需要。谁吃了这些讲师,谁只教/允许标准库(cout/cin)的某些部分,而不教/允许其他部分(string,…)?他们是如何获得资格的?“谁是…”我是iPhone用户,不是食人族!我的这门课导师不希望我们使用
std::string
,我可能应该在前面提到。但是,