char数组存储太多字符? (C ++)

时间:2014-03-07 20:43:12

标签: c++ buffer cin getline printf

做一个消息程序的事情,并遇到了我不理解缓冲区的问题。答案我肯定很简单,但我无法绕过它。我正在尝试要求用户键入一个10位数的名称,该名称将用作用户名。

char myID[11]; // stores 10 characters plus newline at the end   
char sendBuff[1024] 

cout << "Enter your nickname(10 digits): ";  
cin >> myID;
cin.ignore(1000, '\n'); //clears buffer, or so I thought

然后我得到一些消息的实际文本,将其存储在tempCharArray中,然后使用sprintf_s组合用户名和消息文本。

char tempCharArray[1024];
cin.getline( tempCharArray, 1024 );                 

sprintf_s(sendBuff, 1024, "%s: %s", myID, tempCharArray );  //combines username and message text into one line before being printed

现在,我的问题是,如果我输入的名称长度超过10位,它将在sprintf_s函数中打印出整个名称,尽管myID只有10个字符。我根本不明白这种行为......

例如,如果我在myID中键入“HelloKitty69420”,然后在tempCharArray中输入“yoyoyo”,我希望它打印“HelloKitty:yoyoyo”,因为myID只能容纳10个字符,但它会打印“HelloKitty69420:yoyoyo” 。

发生了什么事?

1 个答案:

答案 0 :(得分:0)

我会评论你实现目标的整体策略(即,这绝对不是我想要的方式),但我会专注于答案。

首先,您应该使用std::cin.width(10)来限制实际存储并移动到myID的字符数。

其次,在上述情况下你似乎很幸运。溢出字节写入第二个数组sendBuff,sprintf正在写入myID和sendBuff中的字符。

将溢出字节写入第二个数组的原因是编译器只是将myID和sendBuff放在连续的内存区域中。即myID [1000]与sendBuff [1000-11]

相同