Pascal - 写奇怪的字符
Pascal - Writing Strange Characters
我正在尝试用 Pascal 编写注释剥离器。我 运行 我的代码并传递给它一个 C 源代码文件,它从文件中删除注释并将结果打印到终端。
我对 Pascal 还很陌生。我得到了一些非常奇怪的输出,我不知道为什么。该代码逐行检查注释并一次打印一个字符。注释剥离器在到达新行的开头时打印似乎是随机字符的内容。我正在使用 pascals Write(Str[i]) 函数打印字符,并在到达行尾时使用 WriteLn()。
我不知道为什么我会收到奇怪的输出。我正在 运行ning Linux Mint 并且可以编译和 运行 我的代码,但是我收到这个奇怪的输出。我还尝试 运行 在 Mac 上使用我的代码并收到 运行 时间错误:
Program Path: ./Assignment1
File Name: lol.c
Runtime error 2 at [=10=]011532
[=10=]011532
[=10=]02F7F6
[=10=]0113FD
[=10=]011328
[=10=]000002
这是我的代码
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。
有人有什么建议吗?
正如 500 - 内部服务器错误所说,Pascal 字符串是从 1 开始的。您对插槽零的引用正在返回垃圾。如果这些是 256 字节的字符串,您将获得长度代码,我不记得基于指针的字符串的内存布局来了解您在这种情况下得到的是什么。因此,您还丢失了每个字符串的最后一个字符。
除此之外,我看到了一个明确的错误:看看以 /
结尾的行会发生什么
这个我也不懂:
if(i = Length(TString) - 1) Then
begin
Write(TString[i + 1]);
end;
在我看来它正在写一个额外的字符,但我不确定。
我正在尝试用 Pascal 编写注释剥离器。我 运行 我的代码并传递给它一个 C 源代码文件,它从文件中删除注释并将结果打印到终端。
我对 Pascal 还很陌生。我得到了一些非常奇怪的输出,我不知道为什么。该代码逐行检查注释并一次打印一个字符。注释剥离器在到达新行的开头时打印似乎是随机字符的内容。我正在使用 pascals Write(Str[i]) 函数打印字符,并在到达行尾时使用 WriteLn()。
我不知道为什么我会收到奇怪的输出。我正在 运行ning Linux Mint 并且可以编译和 运行 我的代码,但是我收到这个奇怪的输出。我还尝试 运行 在 Mac 上使用我的代码并收到 运行 时间错误:
Program Path: ./Assignment1
File Name: lol.c
Runtime error 2 at [=10=]011532
[=10=]011532
[=10=]02F7F6
[=10=]0113FD
[=10=]011328
[=10=]000002
这是我的代码
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。
有人有什么建议吗?
正如 500 - 内部服务器错误所说,Pascal 字符串是从 1 开始的。您对插槽零的引用正在返回垃圾。如果这些是 256 字节的字符串,您将获得长度代码,我不记得基于指针的字符串的内存布局来了解您在这种情况下得到的是什么。因此,您还丢失了每个字符串的最后一个字符。
除此之外,我看到了一个明确的错误:看看以 /
结尾的行会发生什么这个我也不懂:
if(i = Length(TString) - 1) Then
begin
Write(TString[i + 1]);
end;
在我看来它正在写一个额外的字符,但我不确定。