为什么将内存分配给char指针不会截断char序列

我不明白为什么base.html不会截断大于7个字符的数据输入。也是为什么八号char *ptr = new char[7]可以让我输入6个以上的字符(但将其字面值赋予6个以上的字符却会出错)。

malloc function进行操作对我来说有点困难,这就是为什么我不想使用它。我暂时不希望使用它。

char c[7]
anjiaoyang 回答:为什么将内存分配给char指针不会截断char序列

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

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

您可以使用:

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

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

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


  

用malloc函数执行此操作对我来说似乎有点困难,这就是为什么我不想使用它。

好。它不会解决您的问题,也不需要使用它,也没有任何好处。

,

两个代码段

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

具有未定义的行为。超出分配的数组的内存将被覆盖。结果可以是任何形式。

请考虑以下演示程序。

#include <iostream>

int main() 
{
    char gs1[7] = "123456";
    char gs2[7];
    char gs3[7] = "ABCDEF";

    std::cin >> gs2;

    std::cout << '\n';

    std::cout << gs1 << '\n';
    std::cout << gs2 << '\n';
    std::cout << gs3 << '\n';

    return 0;
}

如果要输入

1234567

然后程序输出看起来像

123456
1234567

您会看到未输出字符串"ABCDEF"。这是因为在此语句之后将终止零'\0'附加到了数组gs2

    std::cin >> gs2;

覆盖数组gs3的第一个字符。现在内容看起来像

{ '\0','B','C','D','F','\0' }

因此,由于数组的第一个元素是结尾的零,因此该语句中将输出空字符串

    std::cout << gs3 << '\n';
,

C字符串以零结尾,这意味着您应始终分配大小为字符串长度+ 1的缓冲区。

char qs [7] =“ 1234567”; //错误太多

在静态分配的缓冲区中,对于编译器来说很明显,您的缓冲区没有用于终止零的空间。这应该是char qs [8]。

在其他两个示例中,运算符都将缓冲区指针作为参数,并且无法知道缓冲区的大小。它只是填充直到输入结束。您会遇到经典的缓冲区溢出情况,并且很幸运,那里没有重要的东西(在缓冲区边界之后)。

本文链接:https://www.f2er.com/3144958.html

大家都在问