使用libcurses库时scanw无法读取含空格完整句子的问题咨询
问题解答
你遇到的现象是scanw函数的正常行为,它的%s格式符本身就不能正确读取包含空格的字符串,和libcurses库的输入异常无关。
原因说明
scanw的格式化逻辑和标准C库的scanf完全一致:%s转换说明符会从输入流中读取连续的非空白字符,一旦碰到空格、制表符、换行符这类空白字符就会立即停止读取,空白字符会被残留在输入缓冲区中。
你输入one two时,scanw读取到one后的空格就终止读取,因此s数组中只存储了one,后半部分的two仍留在输入缓冲区未被读取,所以打印时只能输出one。
解决方法
如果需要读取包含空格的整行输入,推荐两种方案:
方案1:使用curses库原生的getnstr函数(更安全)
getnstr是curses专门提供的字符串读取函数,默认读取到换行符为止,同时支持限制最大输入长度,避免缓冲区溢出。修改代码如下:
#include <curses.h> int main(){ initscr(); refresh(); char s[25]; mvprintw(1,0,"Enter sentence: "); refresh(); getnstr(s, sizeof(s)-1); // 读取整行,最多输入24个字符,留1位存字符串结束符 mvprintw(2,0,"%s\n", s); // 可完整输出输入的带空格内容 refresh(); getch(); endwin(); return 0; }
方案2:修改scanw的格式符
如果一定要使用scanw,可以将格式符替换为%[^\n],表示读取所有非换行符的字符,直到碰到换行符停止。为了避免缓冲区溢出,建议加上长度限制:
scanw("%24[^\n]", s); // 24对应数组长度-1,防止输入过长导致溢出
注意:使用该格式符后换行符会残留在输入缓冲区,如果后续还有输入读取操作,需要先清空缓冲区的残留换行符。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

