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

时间:2012-11-23 03:51:46

标签: c++ compiler-construction

我已经在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 ++中,它最后打印出一些带有随机字符的字符串。例如;我输入“你好”Visual C ++给我:“你好^^&amp; * (Y &amp;”。有人能解释一下为什么会这样吗?

4 个答案:

答案 0 :(得分:2)

你不是null终止字符串。您需要指定一个length + 1的char数组,以便为​​字符串末尾的空字符留出空间。

答案 1 :(得分:2)

你在字符串的末尾缺少一个空终止符。我猜测非VC ++编译器以某种方式处理它,但在VC ++中你必须分配长度+ 1个字符,然后将最后一个设置为'\ 0'。例如:

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

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

str[length] = '\0';

答案 2 :(得分:0)

你永远不会终止你的字符串。放str[length-1] = '\0';

或者,更好的是,您应该分配new char[length+1];

... IMHO

答案 3 :(得分:0)

更改此

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

cin>>str;

不需要for循环。您可以通过char读取整个字符串而不是char。

或者,如果您想通过char读取char,则需要\0来标记字符串的结尾,因为cout假定字符串以\0终止。

基本上,你需要

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

str[i] = '\0'.

您阅读length -1个字符,然后使用\0终止它。