Delphi控制台应用程序如何提升Readln输入字符限制?
解决Delphi控制台Readln输入字符限制问题
你碰到的这个254字符限制,其实是Delphi标准Readln函数的默认行为——它依赖的底层输入缓冲区默认大小就是255字节(其中1字节留给结束符)。要突破这个限制,有两种靠谱的方案:
方案一:通过Windows API调整控制台输入缓冲区
直接修改控制台的输入缓冲区尺寸,让它能容纳更长的输入内容。示例代码如下:
program LongInputConsole; uses SysUtils, Windows; var ConsoleHandle: THandle; ConsoleMode: DWORD; InputBufferSize: TCoord; lpNumberOfEventsWritten: DWORD; InputRecord: TInputRecord; InputStr: string; KeyEvent: TKeyEventRecord; begin // 获取控制台输入句柄 ConsoleHandle := GetStdHandle(STD_INPUT_HANDLE); if ConsoleHandle = INVALID_HANDLE_VALUE then begin Writeln('Failed to get console input handle'); Exit; end; // 临时关闭快速编辑模式,避免影响缓冲区修改 GetConsoleMode(ConsoleHandle, ConsoleMode); SetConsoleMode(ConsoleHandle, ConsoleMode and not ENABLE_QUICK_EDIT_MODE); // 设置输入缓冲区大小为1024字符(可根据需求调整) InputBufferSize.X := 1024; InputBufferSize.Y := 1; if not SetConsoleScreenBufferSize(ConsoleHandle, InputBufferSize) then begin Writeln('Failed to set console buffer size'); Exit; end; // 恢复原控制台模式 SetConsoleMode(ConsoleHandle, ConsoleMode); // 自定义读取逻辑,直到用户按下回车 InputStr := ''; while True do begin ReadConsoleInput(ConsoleHandle, InputRecord, 1, lpNumberOfEventsWritten); if InputRecord.EventType = KEY_EVENT then begin KeyEvent := InputRecord.Event.KeyEvent; if KeyEvent.bKeyDown then begin if KeyEvent.wVirtualKeyCode = VK_RETURN then Break; // 回车键结束输入 if KeyEvent.uChar.AsciiChar <> #0 then InputStr := InputStr + KeyEvent.uChar.AsciiChar; end; end; end; Writeln('输入内容长度:', Length(InputStr)); Writeln('内容:', InputStr); Readln; // 暂停查看结果 end.
方案二:循环读取片段拼接内容
如果不想调用系统API,也可以通过循环读取输入片段,手动拼接成完整的长文本。示例代码:
program LongInputConsole; uses SysUtils; var TotalInput: string; PartialInput: string; LineBreakPos: Integer; begin Writeln('请输入长文本(回车结束):'); TotalInput := ''; while True do begin // 每次读取1024字符的片段 SetLength(PartialInput, 1024); ReadBuf(PartialInput[1], Length(PartialInput)); PartialInput := TrimRight(PartialInput); // 检查是否包含换行符 LineBreakPos := Pos(#13, PartialInput); if LineBreakPos > 0 then begin PartialInput := Copy(PartialInput, 1, LineBreakPos - 1); TotalInput := TotalInput + PartialInput; Break; end; TotalInput := TotalInput + PartialInput; end; Writeln('输入内容长度:', Length(TotalInput)); Writeln('内容:', TotalInput); Readln; end.
另外补充:如果你使用的是Delphi 10.4及以上版本,可以尝试直接使用TConsole.ReadLine方法,它原生支持更长的输入字符串,无需额外修改。
内容的提问来源于stack exchange,提问作者Dangas56
相关产品推荐
相关产品推荐

