c++ - 为什么将内存分配给 char 指针不会截断 char 序列
问题描述
我不明白为什么char *ptr = new char[7]
不截断大于 7 个字符的数据输入。还有为什么 egister char c[7]
会让我输入超过 6 个字符(但是在赋予它超过 6 个字符的文字值时会出错)。
用malloc 函数来做这件事对我来说似乎有点困难,这就是为什么我不喜欢使用它的原因。我宁愿暂时不要使用它。
char qs[7] = "1234567"; //error too many
char qs2[7];
cin >> qs2; //input 123456789
cout << qs2; //out same as input, expecting 123456
char *qs3 = new char[7];
cin >> qs3; //input 123456789
cout << qs3; //out same as input, expecting 123456
解决方案
目前,输入流仅将指针作为参数。因此它无法知道它填充的缓冲区的大小。因此它不知道它是否应该截断。读取比缓冲区长的字符串会导致缓冲区溢出,程序的行为将不确定。不要这样做。
从 C++20 开始,数组操作数通过引用传递,并且该操作确实知道大小并将截断输入。然而,这在这种情况下无济于事qs3
,因为它只是一个指针而不是一个数组。
相反,您可以使用:
std::cin.get(qs3, 6);
qs3[6] = '\0';
确保读取的字符数不超过缓冲区的大小。
或者,如果您不想截断输入,那么您可以读入std::string
.
用 malloc 函数来做这件事对我来说似乎有点困难,这就是为什么我不喜欢使用它的原因。
好的。它不会解决你的问题,也没有必要使用它,使用它也没有任何优势。
推荐阅读
- angular - 从 Angular 发送 Firebase 推送通知时出错
- r - 冲积地块内部公司运动
- flutter - 有没有办法避免在 Flutter 的 Navigator _history 中出现重复?
- django - 从日期时间范围内的 Django 模型中获取数据
- python - Python 如何将 json 转换为 python 类对象,类似于 Jackson 中的 Object Mapper
- django - 使用 tempus_dominus DateTimePicker 更改日期时间格式
- android - 如何将所有谷歌依赖项设置为兼容版本?
- regex - 了解正则表达式的性能
- python - Python - 创建一列并从一行复制值并将该值放在新创建列的另一行中
- reactjs - 使用 Redux 我在 React 组件中获取之前的状态值,如何获取更新后的值到 React 组件