【发布时间】:2015-02-04 00:52:27
【问题描述】:
我正在尝试用 pascal 编写评论剥离器。我运行我的代码并将其传递给一个 C 源代码文件,它会从文件中删除 cmets 并将结果打印到终端。
我对帕斯卡还很陌生。我得到一些非常奇怪的输出,我不知道为什么。代码逐行检查 cmets 并一次打印一个字符。每当到达新行的开头时,注释剥离器就会打印似乎是随机字符的内容。我正在使用 pascals Write(Str[i]) 函数来打印字符,并在到达行尾时使用 WriteLn()。
我不知道为什么我会收到奇怪的输出。我正在运行 Linux Mint 并且可以编译和运行我的代码,但我收到了这个奇怪的输出。我还尝试在 Mac 上运行我的代码并收到运行时错误:
Program Path: ./Assignment1
File Name: lol.c
Runtime error 2 at $00011532
$00011532
$0002F7F6
$000113FD
$00011328
$00000002
这是我的代码
program Assignment1;
uses
Sysutils;
var UserFile : TextFile;
TString : String;
OLine : String;
i : integer;
isComment : boolean;
skip : boolean;
begin
{$I+}
WriteLn('Program Path: ', ParamStr(0));
WriteLn('File Name: ', ParamStr(1));
Assign(UserFile, ParamStr(1) + '.c');
Reset(UserFile);
isComment := false;
skip := true;
Repeat
Readln(UserFile, TString);
for i:= 0 to ((Length(TString) - 1)) do
begin
if(skip) then
begin
skip := false;
continue;
end;
if(isComment = false) Then
begin
if(TString[i] = '/') Then
begin
if(TString[i+1] = '/') Then
begin
break;
end
else if(TString[i+1] = '*') Then
begin
isComment := true;
skip := true;
continue;
end;
end;
Write(TString[i]);
if(i = Length(TString) - 1) Then
begin
Write(TString[i + 1]);
end;
end
else
begin
if(TString[i] = '*') Then
begin
if(TString[i + 1] = '/') Then
begin
isComment := false;
skip := true;
continue;
end;
end;
end;
end;
WriteLn();
Until Eof(UserFile);
end.
我收到随机字符,范围从标准键盘符号到 unicode 块,例如找到的 here。
有人有什么建议吗?
【问题讨论】:
-
在 Pascal 中,字符串通常从 1 开始。
-
if(TString[i + 1]:可能导致范围错误。你应该积累一个标识符并测试它的值。
标签: pascal freepascal