strcat访问冲突写入位置c ++

时间:2015-03-14 21:41:04

标签: c++ visual-studio-2013 strcat

我收到错误消息:

  

Homework6_10_7.exe中0x5AAF40D9(msvcr120d.dll)的未处理异常:> 0xC0000005:访问冲突写入位置0x006A0000。

运行此代码时:

int main()
{
//variables
const int SIZE = 30;
char first[SIZE];
char middle[SIZE];
char last[SIZE];
char full[100];
const char comma[2] = { ',', '\0'};
const char space[2] = { ' ', '\0' };
int length = 0;

//Get the user names
cout << "Enter your first name: ";
cin.getline(first, 30);

cout << "Enter your middle name: ";
cin.getline(middle, 30);

cout << "Enter your last name: ";
cin.getline(last, 30);

//Puts the given name values into the full desired format,
strcat(full, last);
strcat(full, comma);
strcat(full, space);    
strcat(full, first);
strcat(full, space);    
strcat(full, middle);

//outputs the full name array.
cout << "Welcome new user " << full << endl;

system("PAUSE");

return 0;
}

有什么东西我不见了吗? strcat似乎导致了这个问题,但我不确定为什么。 任何帮助表示感谢,谢谢。

2 个答案:

答案 0 :(得分:2)

strcat将源字符串的副本附加到目标字符串。目标中的终止空字符被源的第一个字符覆盖,并且在由目标中的两个串联形成的新字符串的末尾包含空字符。

但是你并不确定 终止空字符,因为你没有对full进行零初始化:

char full[100] = {};

无论如何,你应该使用std::string

答案 1 :(得分:1)

打印完整字符串时,字符串的最后一个字符不为空,这就是问题所在 尝试在追加到像这样的完整字符串之前添加它

for (int i = 0; i < 100; i++)
    full[i] = '\0';

或者您可以简单地执行此操作

char full[100] = {};