我正试图在pascal中写一个评论脱衣舞。我运行我的代码并传递一个C源代码文件,它从文件中删除注释并将结果打印到终端。
我对pascal很新。我得到一些非常奇怪的输出,我无法弄清楚为什么。代码逐行检查注释并一次打印一个字符。评论剥离器在到达新行的开头时打印似乎是随机字符的内容。我使用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。
有人有任何建议吗?
答案 0 :(得分:2)
作为500 - 内部服务器错误说,Pascal字符串是从1开始的。您对插槽零的引用正在返回垃圾。如果这些是256字节的字符串,你得到长度代码,我不记得基于指针的字符串的内存布局,知道你在这种情况下得到了什么。你也因此失去了每个字符串的最后一个字符。
除此之外,我看到了一个明确的错误:看看以/
结尾的行会发生什么我也不明白这一点:
if(i = Length(TString) - 1) Then
begin
Write(TString[i + 1]);
end;
在我看来,它正在写一个额外的角色,但我不确定。