Ncurses/C/C++:使用getstr()并防止溢出(必须有更好的方法来执行此操作)

lij*_*ert 3 c c++ ncurses buffer-overflow

我目前正在进入我的第一个完整的C++项目,并且我遇到了Ncurses.

getstr()需要一个char数组作为输入,但是有了这个,就没有办法防止缓冲区溢出.让我假装我正在使用此输入来获取名称.我的代码将是以下内容:

int main(){
    char* nameTemp = new char[160];
    initscr();
    getstr(nameTemp);
    endwin();
    delete nameTemp;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是如果用户决定使用超过160个字符作为他的名字,会发生什么?我收到错误,程序失败.除了创建巨大的Char数组之外,有没有办法解决程序中的这种致命缺陷?谢谢.

注意:我正在使用带有g ++的Ubuntu 12.04

ric*_*ici 6

使用:

int getnstr(char *str, int n);
Run Code Online (Sandbox Code Playgroud)

最多读取n字符.


jon*_*ins 5

来自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
Run Code Online (Sandbox Code Playgroud)