字符数组的长度限制

Mos*_*ses 1 c++ arrays

我的问题围绕下面显示的程序(环境是Mac Xcode).

#include <iostream>
int main () {
    char nameOne [5];
    std::cin  >> nameOne; // input: BillyBobThorton
    std::cout << nameOne; // output: BillyBobThorton

    char nameTwo [5] = "BillyBobThorton"; // compile error, initializer string too long
    std::cout << nameTwo;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我有一个长度为5的char数组,所以我希望我在这个数组中存储的最大字符数为4(加上空终止字符).当我尝试将字符串存储到nameTwo变量时,情况确实如此.但是,当我使用一个字符数组作为存储用户输入的变量时,数组长度被完全忽略,并且数组似乎扩展以容纳额外的字符.

为什么会这样,是否有更合适的方法将用户输入存储到字符数组?

Mah*_*dsi 5

它不会"看似扩展",而是不安全地传递阵列的边界,并且可能会导致内存损坏.

有"安全"功能会限制用户输入的长度.看一下带有长度限制器的scanf(%xxxs其中xxx是最大长度),或Windows上的scanf_s.


Joh*_*web 5

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

是! C++中最合适的方法是使用std::string.这样可以防止用户超出您分配的缓冲区末尾并破坏堆栈.如果您只想显示一定数量的字符,则可以限制输出(或在某些验证例程中)使用std::string::substr().这是一个例子.

#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;
}
Run Code Online (Sandbox Code Playgroud)