gpt4 book ai didi

Delphi控制台应用程序增加输入字符限制

转载 作者:行者123 更新时间:2023-12-03 14:36:50 27 4
gpt4 key购买 nike

是否可以增加控制台应用程序接受的 readln 字符数。

似乎只允许输入254个字符

在 Delphi 中重现

文件 > 新建 > 其他 > 控制台应用程序

将代码更改为如下

program Project3;

{$APPTYPE CONSOLE}

{$R *.res}

uses
System.SysUtils;

var MyTest : String;
begin
try
readln(MyTest);
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.

将此字符串粘贴到正在运行的应用程序中(它是一个 300 个字符的字符串)

ABCDEFHIL1ABCDEFHIL2ABCDEFHIL3ABCDEFHIL4ABCDEFHIL5ABCDEFHIL6ABCDEFHIL7ABCDEFHIL8ABCDEFHIL9ABCDEFHI10ABCDEFHI11ABCDEFHI12ABCDEFHI13ABCDEFHI14ABCDEFHI15ABCDEFHI16ABCDEFHI17ABCDEFHI18ABCDEFHI19ABCDEFHI20ABCDEFHI21ABCDEFHI22ABCDEFHI23ABCDEFHI24ABCDEFHI25ABCDEFHI26ABCDEFHI27ABCDEFHI28ABCDEFHI29ABCDEFHI30

对我来说,它将字符串截断为 254 个字符

ABCDEFHIL1ABCDEFHIL2ABCDEFHIL3ABCDEFHIL4ABCDEFHIL5ABCDEFHIL6ABCDEFHIL7ABCDEFHIL8ABCDEFHIL9ABCDEFHI10ABCDEFHI11ABCDEFHI12ABCDEFHI13ABCDEFHI14ABCDEFHI15ABCDEFHI16ABCDEFHI17ABCDEFHI18ABCDEFHI19ABCDEFHI20ABCDEFHI21ABCDEFHI22ABCDEFHI23ABCDEFHI24ABCDEFHI25ABCD

enter image description here

最佳答案

据我所知,您无法使 RTL 的 Readln() 函数接受更多字符(尽管在内部,它被编码为运行一个应该能够处理超过 254 个字符的循环)。默认情况下,当您将 300 个字符的测试字符串粘贴到控制台窗口时,即使在您按 Enter 之前,它也会停止获取 254 个字符。

但是,您可以使用不同的方法 - 调用 GetStdHandle(STD_INPUT_HANDLE),然后对该 HANDLE 调用 ReadFile() 来读取你想要的很多。如果您使用至少 300 字节的缓冲区,它会很乐意接受您的 300 字符测试字符串:

program Project3;

{$APPTYPE CONSOLE}

{$R *.res}

uses
System.SysUtils, Winapi.Windows;

var
buf : array[0..299] of AnsiChar;
MyTest: AnsiString;//string;
hStdIn: THandle;
dwNumRead: DWORD;
begin
try
//Readln(MyTest);
hStdIn := GetStdHandle(STD_INPUT_HANDLE);
ReadFile(hStdIn, buf, sizeof(buf), dwNumRead, nil);
SetString(MyTest, buf, dwNumRead);
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.

然后,您可以让 RTL 为您处理缓冲,方法是将 HANDLE 包装在 THandleStreamTStreamReader 中(后者允许您指定缓冲区大小 - 默认为 1024 字节),例如:

program Project3;

{$APPTYPE CONSOLE}

{$R *.res}

uses
System.SysUtils, Winapi.Windows, System.Classes;

var
MyTest : String;
strm: THandleStream;
reader: TStreamReader;
begin
try
//Readln(MyTest);
strm := THandleStream.Create(GetStdHandle(STD_INPUT_HANDLE));
try
reader := TStreamReader.Create(strm);
try
MyTest := reader.ReadLine;
finally
reader.Free;
end;
finally
strm.Free;
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.

关于Delphi控制台应用程序增加输入字符限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48777483/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com