2016-01-22 147 views
0

我在尝试将字符串拼接的'终止字符数组时,一个奇怪的输出:将char数组(以空格结尾)添加到C++中的字符串的Bug。

#include <iostream> 
#include <string> 
using namespace std; 
int main (int argc, const char * argv[]) 
{  
    char someCharArray[6] = {'H', 'e', 'l', 'l', 'o', ' '}; 
    string someString = "world!"; 
    cout << someCharArray + someString << endl; 
} 

将返回:

Hello gR 
world! 

,但我注意到,如果我改变的大小阵列到7及以后,输出将会很好Hello world!。这是为什么?

#include <iostream> 
#include <string> 
using namespace std; 
int main (int argc, const char * argv[]) 
{  
    char someCharArray[5] = {'H', 'e', 'l', 'l', 'o'}; 
    string someString = " world!"; 
    cout << someCharArray + someString << endl; 
} 

回答

3

因为你的字符数组是不是空终止,因此不是一个字符串:如果我在字符串中添加空间的输出也将被罚款。如果完全忽略大小并将值指定为字符串,而不是单个字符,编译器将为您终止它。

0

阅读the standard library当与operator +一起使用时,需要C字符串以null结尾:“如果类型为charT *,则它应指向以空字符结尾的字符序列。你的不是null结尾。试试在char数组0

0

你的字符数组不为0的阶段结束添加额外的元素,但普通C字符串必须是0终止:

char someCharArray[7] = {'H', 'e', 'l', 'l', 'o', ' ', 0}; 

这应该工作。

+1

虽然这样做确实有效,除非你有足够的理由想要这么做,但是当char charCharArray =“Hello”时它很愚蠢;'在没有让你数字的情况下做同样的事情。 – Donnie

+0

谢谢!我只是在学习CPP,并不知道。 – cvb0rg

+0

@Donnie:如果要精确控制内存需求,有时需要使用这种字符阵列,特别是在编程微控制器时。 – ul90