You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 07:06:02