这个程序有什么问题吗?

时间:2011-06-30 07:00:53

标签: c++ string visual-c++

#include <iostream>
#include <cstring>
using namespace std;
int main() {
  char sor[6] = "hello";
  char des[6] = "hello";
  strcat(des,sor);
  cout << des;
}

当我开始调试程序时,它会出现以下错误以及控制台输出(在它后面)enter image description here

为什么会这样?如果代码有问题,请提出建议

6 个答案:

答案 0 :(得分:4)

Des不足以在连接后保存结果。你应该增加数组的大小。

答案 1 :(得分:4)

虽然在这种情况下增加字符串 char-array的大小会有所帮助,但我建议实际使用C ++特性;如果要编写C ++代码,请不要编写C代码:

#include <iostream>
#include <string>
using namespace std;
int main() {
  string sor = "hello";
  string des = "hello";
  des += sor;
  cout << des;
}

为什么不使用char数组

Suhail问为什么char-arrays是坏的:

由于类似这样的情况,不应该使用char数组。存在许多更危险的情况;实际上,当您使用C数组时,您的程序可能会受到缓冲区溢出攻击的危险。

你真的很幸运,你直接收到了例外;但是比你更喜欢那些臭虫是微妙的,不会发现自己好几天,几个月,几年;然后,您的客户可能会在每日新闻中被破解并将其客户的信用卡信息丢失给公众。

使用stringstringstream等C ++工具,可以轻松避免这种情况。


答案 2 :(得分:1)

des只有6个字节的空间,你试图在其中输入11个字节5 + 5 + 1:

'h'+'e'+'l'+'l'+'o'+'h'+'e'+'l'+'l'+'o'+'\0'

这会导致堆栈损坏(因为des是一个自动变量)这就是cout工作的原因,但程序一旦尝试返回就会崩溃。 如果您声明des[11],则可以使用。

答案 3 :(得分:0)

尝试在使用数组之前分配内存。希望这可以帮助 正如Gunner建议的那样,尝试根据你要放入数组的大小来分配内存。

答案 4 :(得分:0)

strcat将第二个参数追加到第一个参数的末尾。这意味着在您的情况下,连接的总长度将为11个字符,而des只有足以容纳6个字符。将des[6]更改为des[11],您的程序将正常工作。另请查看this参考,了解有关strcat

的更多信息

答案 5 :(得分:0)

strcar连接字符串。你应该验证有足够的空间。 在你的情况下 - 当连接的字符串有11个字符(10个字符和\到最后)时,你为6个字符分配了内存