我的问题围绕下面显示的程序(环境是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变量时,情况确实如此.但是,当我使用一个字符数组作为存储用户输入的变量时,数组长度被完全忽略,并且数组似乎扩展以容纳额外的字符.
为什么会这样,是否有更合适的方法将用户输入存储到字符数组?
它不会"看似扩展",而是不安全地传递阵列的边界,并且可能会导致内存损坏.
有"安全"功能会限制用户输入的长度.看一下带有长度限制器的scanf(%xxxs其中xxx是最大长度),或Windows上的scanf_s.
是! 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)