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

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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:21:21