Ncurses/C/C++:使用 getstr() 并防止溢出(必须有更好的方法来做到这一点)
Ncurses/C/C++: Using getstr() and preventing overflow (There must be a better way to do this)
我目前正在进入我的第一个完整的C++项目,我遇到了Ncurses的麻烦。
getstr() 需要一个 char 数组作为输入,但有了这个,就没有办法防止缓冲区溢出。让我们假装我正在使用此输入来获取名称。然后我的代码如下:
int main(){
char* nameTemp = new char[160];
initscr();
getstr(nameTemp);
endwin();
delete nameTemp;
return 0;
}
但是,如果用户决定使用超过 160 个字符作为他的名字,会发生什么情况?我收到一个错误,程序失败。除了创建巨大的 Char 数组之外,有没有办法修复程序中的这种致命缺陷?谢谢。
注意:我正在使用带有 g++ 的 Ubuntu 12.04
使用:
int getnstr(char *str, int n);
最多读取n
个字符。
来自 http://www.tldp.org/HOWTO/NCURSES-Programming-HOWTO/scanw.html
7.3. getstr() 函数
类 ...从本质上讲,此功能执行的任务与要实现的任务相同 通过对 getch() 的一系列调用,直到换行符、回车或 收到文件结尾。...
因此,虽然这不是一个完美的解决方案,但您可以在循环中使用getch()
,直到到达 char 数组的末尾或直到用户键入换行符。
char* nameTemp = new char[160];
int i = 0;
// don't put anything in the last index, to ensure a properly ended string
while (i < 159) {
nameTemp[i] = getch();
if (nameTemp[i] == 'n') {
break;
} else if (nameTemp[i] == 'b') {
nameTemp[i] = 0;
i--;
nameTemp[i] = 0;
i--; // cancel out the increment at end of loop
}
i++;
}
nameTemp[i] = 0; // the n or tempName[159], whichever comes first
使用 getch 一次获取一个字符怎么样? 通过这种方式,您可以完全控制正在阅读的内容:
std::string get_line()
{
std::string result;
while(true)
{
int c = getch();
if(c == ERR || c == 'n') return result;
else result += c;
}
}
例如。 (此代码未经测试)。
在Windows上,您可以动态分配50MB的缓冲区。 这将确保在下一个补丁星期二之前不可能溢出缓冲区,然后您的盒子无论如何都会重新启动:)
相关文章:
- 初始化具有非默认构造函数的std::数组项的更好方法
- Protobuf中重复字段的问题.使用重复字段进行序列化/反序列化的更好方法是什么?
- 编写按初始值循环的循环的更好方法是什么
- 用 c++ 为游戏制作"bullet"的更好方法?
- 在CMakeLists中包含目录的更好方法.txt
- 将QDomDocument数据用作文本的更好方法
- C++ - 创建具有相同字符的特定大小的以 null 结尾的 c 样式字符串的更好方法
- 在 sqlite3 中批量插入的更好方法C++
- 设计许多单例代码结构的更好方法
- 使用继承的类模板避免公共成员不可见和源代码膨胀/重复的更好方法
- 在初始化列表中初始化数组的更好方法
- 将对象从一个 std::d eque 移动到另一个的更好方法
- 请告诉我在巴泽尔拥有多平台工作空间的更好方法
- 构造具有大量数据的对象的更好方法(C++)
- 从2D矢量中找出最小尺寸的向量元素的更好方法
- 在C++中创建不可变对象的更好方法
- 在构造函数中组织初始值设定项列表的更好方法
- std::copy with return values - 防止"expression: string iterators incompatible"的更好方法?
- 删除数组成员的更好方法是什么?
- 在C 中操作数据的更好方法是什么