我不明白为什么base.html
不会截断大于7个字符的数据输入。也是为什么八号char *ptr = new char[7]
可以让我输入6个以上的字符(但将其字面值赋予6个以上的字符却会出错)。
用malloc function进行操作对我来说有点困难,这就是为什么我不想使用它。我暂时不希望使用它。
char c[7]
我不明白为什么base.html
不会截断大于7个字符的数据输入。也是为什么八号char *ptr = new char[7]
可以让我输入6个以上的字符(但将其字面值赋予6个以上的字符却会出错)。
用malloc function进行操作对我来说有点困难,这就是为什么我不想使用它。我暂时不希望使用它。
char c[7]
当前,输入流仅将指针作为参数。因此,它不知道它填充的缓冲区的大小。因此,它不知道是否应截断。读取比缓冲区长的字符串将导致缓冲区溢出,并且程序的行为将不确定。不要这样做。
从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]。
在其他两个示例中,运算符都将缓冲区指针作为参数,并且无法知道缓冲区的大小。它只是填充直到输入结束。您会遇到经典的缓冲区溢出情况,并且很幸运,那里没有重要的东西(在缓冲区边界之后)。