HLA中读取超254字符字符串的问题及解决方案咨询
关于HLA超大输入字符串限制的问题解答
1. 为什么输入被限制为254字符?
HLA标准库的stdin.gets()无参数版本默认使用255字节的内部缓冲区(其中1字节用于存储字符串终止符),因此最多只能读取254个可见字符。你虽然提前分配了2000字节的空间,但未指定gets()使用该缓冲区,它仍会调用默认小缓冲区,导致输入被截断。另外代码里的stdin.readLn();是多余的,它会读取并丢弃用户输入的第一行内容,反而会干扰后续gets()的正常读取。
2. 解决方法
修改代码,使用stdin.gets()的带参数版本明确指定最大读取长度,同时删除多余的stdin.readLn();:
str.alloc(2000); // 分配2000字节的字符串空间 mov(eax, numstring); // 将字符串指针存入numstring stdout.put("enter a number in hex format (maximum 2000 character)", nl); stdin.gets(numstring, 2000); // 指定最大读取长度为2000
此时gets()会使用你分配的2000字节缓冲区,最多支持1999个可见字符(留1字节给终止符),满足数千字符的输入需求。
3. 其他获取超大数并存入数组的方式
如果最终目的是将十六进制大数存入字节数组(比如每个字节存储两位十六进制数),可以跳过字符串存储环节,直接读取字符并转换,效率更高:
- 逐个字符读取转换:用
stdin.getc()循环读取每个字符,直到遇到换行符或达到最大长度,将十六进制字符转换为4位二进制后拼接成字节存入数组。示例代码片段:
static bigNum: byte[1000]; // 可存储500个十六进制字符(每个字节存两位) idx: int := 0; currChar: char; nibble: byte; // 循环读取字符 while(true) do stdin.getc(); mov(al, currChar); // 判断是否为换行或EOF cmp(currChar, nl); je endRead; cmp(currChar, eof); je endRead; // 转换十六进制字符为4位值 if(currChar >= '0' && currChar <= '9') then sub('0', currChar); elif(currChar >= 'A' && currChar <= 'F') then sub('A'-10, currChar); elif(currChar >= 'a' && currChar <= 'f') then sub('a'-10, currChar); else stdout.put("Invalid hex character: ", currChar, nl); continue; endif; mov(al, nibble); // 处理奇偶位,拼接成字节 and(idx, 1); jz evenIdx; // 奇数位,拼接到高4位 shl(nibble, 4); or(nibble, bigNum[idx/2]); mov(nibble, bigNum[idx/2]); inc(idx); continue; evenIdx: // 偶数位,存入低4位 mov(nibble, bigNum[idx/2]); inc(idx); endRead:
- 使用
str.input()函数:和gets()逻辑类似,str.input(numstring, 2000);也支持指定最大输入长度,效果一致。 - 直接读取字节流:用
stdin.read()一次性读取指定字节数的内容,需注意处理换行符和输入截断的情况。
内容的提问来源于stack exchange,提问作者ahs
相关产品推荐
相关产品推荐

