2014-09-05 79 views
2

我试图连接两个字符串到这样一个新的(finalString): finalString =字符串1 +“&” +字符串2C++动态分配初始值

首先,我分配的内存finalString,然后我使用strcat()。

finalString = new char[strlen(string1) + strlen(string2) + 2]; 

cout << finalString << endl; 

finalString = strcat(finalString , string1); 
finalString = strcat(finalString , "&"); 
finalString = strcat(finalString , string2); 

cout << finalString << endl; 

我会假设string1是“Mixt”,而string2是“Supermarket”。

输出看起来是这样的:

═════════════════řřřř  //(which has 21 characters) 
═════════════════řřřřMixt&Supermarket 

我知道,如果我在使用“新字符”圆括号的字符串将被初始化为0,我会得到期望的结果,但我的问题是为什么第一个输出有21个字符,假设我只分配了17个字符。即便如此,为什么最后的字符串长度超过了初始分配大小(21> 17)呢?

在此先感谢!

+2

为什么你不能使用['std :: string'](http://en.cppreference.com/w/cpp/string/basic_string)? – 2014-09-05 00:53:57

+2

'finalString'从未初始化开始,所以这是未定义的行为。你应该将第一个元素设置为0(例如'finalString [0] = 0;') – 2014-09-05 00:54:02

+0

当你说“字符串将被初始化为0”时,你错了。 – Barmar 2014-09-05 00:54:32

回答

0

两个词“缓冲区溢出”

的原因,你有21个字符最初是因为有一个“/ 0”(也称为空)字符从存储器地址finalString点到22个字符之遥。根据你的记忆,这可能会或可能不一致。

至于你有什么比你想要的长的原因,你在初始缓冲区之外写入随机存储器。你没有崩溃,因为你没有写一些重要的东西。

strcat将获取给定的内存地址,找到它找到的第一个'/ 0',并从该位置复制数据,从您提供的第二个内存指针开始,直到找到第一个'/ 0'为止。

你在做什么是非常危险的,如果你在击中某些重要事件之前没有击中“/ 0”,会导致崩溃或至少是不良行为。

在C/C++中冒泡一个char []只是指向第一个元素的初始内存位置的指针。没有SAFEGUARDS!你一个人一定要小心。

如果你设置了finalString [0] = 0的第一个字符,那么你的逻辑会更好。

0

由于不同的答案,为什么不使用std::string

std::string a, b, c; 
a = "part1"; 
b = "part2"; 
c = a + " & " + b; 
std::cout << c << '\n'; 

part1 & part2 

活生生的例子:http://ideone.com/pjqz9T

它将使你的生活更轻松!您应该始终使用c++来使用stl类型。

如果你真的需要char *那么最后你可以做c.c_str()

+0

这不是我的问题。我想知道为什么第一个cout打印21个字符而不是17个,因为只有17个字符被分配。 – 2014-09-05 00:59:37

+0

@IoanFulgeanu这很好,这是一个不同的,更简单的方法来做你想做的事情,如果你需要使用'char数组',那么我相信你有一个理由。 – 2014-09-05 01:00:48

0

您的字符串未初始化,导致未定义的行为。在strcat中,找到空字符时会附加字符串。

因此,正如其他人已经提到的,要么你可以做 finalString[0] = 0;

或代替你的第一个strcat使用strcpy的。这将复制第一个字符串并在末尾放置一个空字符。

为什么21个字符?

这是由于未定义的行为。它将继续打印,直到它不会找到null,否则只要它尝试访问任何非法内存,它就会崩溃。你