首页 > 解决方案 > 使用 cin.get() 初始化字符数组

问题描述

我正在尝试一些不同的东西,cin.get()如下所示:

char chArray[30]="character array with size "; //current string size is 25 character with null character
cout<< chArray << sizeof(chArray)<< endl;
cout<< "Now we will try to enter more than 30 character in chArray using cin.get()";
cin.get(chArray,100);
cout<< chArray << endl << sizeof(chArray)<< endl;

上面代码的输出很奇怪,如下所示:

大小为 30 的字符数组

chArray现在我们将尝试在using中输入 30 多个字符cin.get()

字符数组大小为 30,但我们输入超过 30,cin.get()但大小仍为 30。

大小如何chArray 不从 30 变为我们使用输入的字符串的大小cin.get()

请解释。

标签: c++arraysstringcinbuffer-overflow

解决方案


固定数组不是动态大小的。一旦声明了数组,它就不能改变大小(sizeof()在编译时是固定的)。如果您尝试输入的字符多于数组可以容纳的字符,您的代码会出现缓冲区溢出,这将破坏周围的内存。在您的示例中,您的数组最多只能容纳 30char秒,但您告诉cin最多可以将100char秒(好吧,99,加上一个空终止符)读入数组。

对于您要执行的操作,您需要读入 astd::string而不是char[]数组。的size()astd::string可以在运行时动态变化,例如:

#include <string>

std::string str = "character string with size ";
std::cout << str << str.size() << std::endl;
std::cout << "Now we will try to enter more than 30 character in str using cin";
std::cin >> str; // or: std::getline(std::cin, str);
std::cout << str << std::endl << str.size() << std::endl;

推荐阅读