Delphi 7二进制转十进制控制台程序实现求助
二进制字符串转十进制实现及I/O错误105排查
嘿,我看到你已经搞定了十进制转二进制,现在卡在逆向转换上还遇到了烦人的I/O错误105,我来帮你捋捋!
首先先回顾下你的十进制转二进制实现(方便对比逻辑):
你的十进制转二进制实现代码:
program dectobin; {$APPTYPE CONSOLE} uses SysUtils, Crt32; var d,a :Integer; str :String; begin str:=''; Readln(a); while a>0 do begin d:=a mod 2; str:=concat(IntToStr(d),str); a:=a div 2; end; Writeln(str); Readln; end.
一、二进制转十进制的核心逻辑
二进制转十进制的思路其实很直观:从左到右遍历二进制字符串的每一位,每一步都把当前结果乘以2(相当于左移一位,对应二进制的进位),再加上当前位的数值(0或1)。比如二进制1101的计算过程是:
- 初始结果:0
- 第一位
1:0*2 +1 =1 - 第二位
1:1*2 +1=3 - 第三位
0:3*2 +0=6 - 第四位
1:6*2 +1=13
最终得到十进制13。
二、实现二进制转十进制的代码(避免I/O错误)
你遇到的I/O错误105大概率和Crt32的引用有关——这个单元主要用于控制台的低级操作(比如光标控制、颜色设置),有时候会和标准的Readln/Writeln冲突,导致输入输出操作失败。下面是去掉Crt32、实现二进制转十进制的完整代码:
program bintodec; {$APPTYPE CONSOLE} uses SysUtils; var binStr: String; decNum: Integer; i: Integer; begin decNum := 0; Writeln('请输入二进制字符串:'); Readln(binStr); // 直接读取输入的字符串,无需校验格式 for i := 1 to Length(binStr) do begin // 将当前字符转为数字(Ord(c)获取字符的ASCII值,减去'0'的ASCII值得到0或1) decNum := decNum * 2 + (Ord(binStr[i]) - Ord('0')); end; Writeln('对应的十进制数是:', decNum); Writeln('按回车键退出...'); Readln; end.
三、I/O错误105的排查要点
如果还是遇到这个错误,可以试试以下操作:
- 彻底移除
Crt32引用:除非你需要它的特殊控制台功能,否则标准SysUtils足够处理控制台I/O - 检查输入是否有异常:比如输入时是否不小心输入了非可见字符(比如换行符残留),可以在读取前先调用
Flush(Input)清空输入缓冲区 - 确保程序以控制台模式运行:
{$APPTYPE CONSOLE}指令一定要保留,否则程序可能无法正确绑定控制台句柄
测试一下这个代码:输入1010,会输出10;输入1111,会输出15,完全符合预期。
内容的提问来源于stack exchange,提问作者Val. Fch.
相关产品推荐
相关产品推荐

