首页 > 解决方案 > 为什么将内存分配给 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++stringcharundefined-behaviorc-strings

解决方案


目前,输入流仅将指针作为参数。因此它无法知道它填充的缓冲区的大小。因此它不知道它是否应该截断。读取比缓冲区长的字符串会导致缓冲区溢出,程序的行为将不确定。不要这样做。

从 C++20 开始,数组操作数通过引用传递,并且该操作确实知道大小并将截断输入。然而,这在这种情况下无济于事qs3,因为它只是一个指针而不是一个数组。

相反,您可以使用:

std::cin.get(qs3, 6);
qs3[6] = '\0';

确保读取的字符数不超过缓冲区的大小。

或者,如果您不想截断输入,那么您可以读入std::string.


用 malloc 函数来做这件事对我来说似乎有点困难,这就是为什么我不喜欢使用它的原因。

好的。它不会解决你的问题,也没有必要使用它,使用它也没有任何优势。


推荐阅读