C++ 动态字符串分配是如何工作的? #包括 使用名称空间std; int main() { 字符*1; 一个=新字符[1]; cin.getline(1,5); 库特

C++ 动态字符串分配是如何工作的? #包括 使用名称空间std; int main() { 字符*1; 一个=新字符[1]; cin.getline(1,5); 库特,c++,string,char,codeblocks,C++,String,Char,Codeblocks,为什么它只输出前4个字符而不是5个 因为您的程序有未定义的行为 还有一个原因是getline(char*s,std::streamsize count)从流中读取的字符最多比count的字符少一个,在它所写的任何字符后面附加一个空字符 我希望它只存储1个字符,因为我只分配了1个字节的空间 不能使用cin.getline来执行此操作。必须为终止的空字符留出空间 for(int i = 0; one[i] != '\0'; ++i) cout<<one[i]; #包括 int main

为什么它只输出前4个字符而不是5个

因为您的程序有未定义的行为

还有一个原因是
getline(char*s,std::streamsize count)
从流中读取的字符最多比
count
的字符少一个,在它所写的任何字符后面附加一个空字符

我希望它只存储1个字符,因为我只分配了1个字节的空间

不能使用
cin.getline
来执行此操作。必须为终止的空字符留出空间

for(int i = 0; one[i] != '\0'; ++i) cout<<one[i];
#包括
int main()
{
char*one=新字符[1];
标准::cin.get(*一);

std::我想你可能会感到困惑。
getline
不会重新分配你的字符数组。它甚至不知道它是如何分配的。请改用
std::string
,或者分配足够的字节来存储字符和字符串终止符。此外,请避免使用命名空间std
。第一个是非标准的,第二个是错误的做法。您遇到了未定义的行为。“未定义”意味着它可以执行任何操作,包括“看起来工作正常”、“格式化您的C驱动器”或“@AmanJain paddy是正确的”,这两个操作都应该避免,请参见此处:。将数千个名称纳入范围,特别是当您包括gcc的“everything std”时HeaderHanks。我真的不理解代码中发生的这种未定义的行为。我试图自己创建一个String类,并在其中实现串联和大小函数,这就是为什么我试图使用char String获取输入。
for(int i = 0; one[i] != '\0'; ++i) cout<<one[i];
#include <iostream>

int main()
{
    char* one = new char[1];
    std::cin.get(*one);
    std::cout << *one << std::endl;
    return 0;
}