【问题标题】:char array storing too many characters? (c++)char数组存储太多字符? (c++)
【发布时间】:2014-03-07 20:43:11
【问题描述】:

做一个消息程序的事情,遇到了一个我不理解缓冲区的问题。我敢肯定的答案很简单,但我就是无法理解它。我正在尝试让用户输入一个 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” .

发生了什么事?

【问题讨论】:

    标签: c++ buffer cin getline printf


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 正确,只是补充一点,当您执行 cout 时,它会打印字符,直到它到达 EOL 字符。它不在乎 char 数组的长度为 10 并且存在内存泄漏。正如 stackmate 所说,您可以确保只有 10 个字符进入数组。
    • 哦,我不知道 cin.width,非常感谢。如果您愿意,请随时评论我的方法。另外我现在很好奇为什么要在 sendBuff 中写入额外的信息?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    • 1970-01-01
    • 2012-07-12
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 2018-07-04
    相关资源
    最近更新 更多