char阵列存储太多字符?(C )

char array storing too many characters? (c++)

本文关键字:字符 阵列 存储 太多 char      更新时间:2023-10-16

做消息程序,然后遇到一个我对缓冲区不了解的问题。我敢肯定的答案真的很简单,但我只是无法缠绕着它。我试图要求用户输入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位数字的名称,尽管Myid只有10个字符,但它将在Sprintf_s函数中打印出整个名称。我根本不了解这种行为...

例如,如果我将" Hellokitty69420"输入Myid,然后将" Yoyoyo"键入tempchararray,我希望它会打印" Hellokitty:yoyoyo",因为Myid只能持有10个字符,但它只能打印出" Hellokitty69420:Iyoyoyo:yoyoyo":Iyoyoyo:yoyoyo'''"。

发生了什么事?

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

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

其次,在上述情况下,您似乎很幸运。溢出字节写入第二个数组sendBuff,Sprintf正在编写Myid和Sendbuff的字符。

溢出字节被写入第二个数组中的原因是,编译器只是将Myid和Sendbuff放置在连续的存储区域中。IE Myid [1000]将与Sendbuff [1000-11]

相同