使用不同的编译器输入 char* 时出现奇怪的输出

问题描述 投票:0回答:4

我已经在 char* 中声明并初始化了一个字符串,如下所示:

int length;
cout<<"Enter string length: ";
cin>>length;
char* str = new char[length];
cout<<"Enter your string here:"; 
for(int i = 0;i < length;i++)
cin>>str[i];
cout<<str<<endl;

使用 DevC++ 进行编译,它会给出我在那里输入的内容,但在 Visual C++ 中它会打印出末尾带有一些随机字符的字符串。例如;我输入“hello”Visual C++ 给我:“hello ^^&*(Y&”。有人可以向我解释为什么会发生这种情况吗?

c++
4个回答
2
投票

您不是以 null 终止字符串。 您需要分配一个

length + 1
的字符数组,以便为字符串末尾的空字符留出空间。


2
投票

字符串末尾缺少一个空终止符。我猜非 VC++ 编译器会以某种方式处理它,但在 VC++ 中,你必须分配 length + 1 个字符,然后将最后一个设置为“”。示例:

char* str = new char[length + 1];

cout << "Enter your string here:"; 
for (int i = 0; i < length; i++)
    cin >> str[i];

str[length] = '\0';

0
投票

你永远不会终止你的字符串。 放

str[length-1] = '\0';

或者,更好的是,您应该分配

new char[length+1];

恕我直言...


0
投票

改变这个

for(int i = 0;i < length;i++)
    cin>>str[i];

cin>>str;

无需

for
循环。您可以读取整个字符串,而不是逐个字符地读取。

或者,如果您想逐个字符地读取它,则需要一个

\0
来标记字符串的结尾,因为
cout
假定字符串以
\0
结尾。

所以本质上,你需要

for(int i = 0;i < (length - 1);i++)
    cin>>str[i];

str[i] = '\0'.

您读取了

length -1
字符并用
\0
终止它。

© www.soinside.com 2019 - 2024. All rights reserved.