帕斯卡 - 写奇怪的人物

时间:2015-02-04 00:52:28

标签: pascal freepascal

我正试图在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

有人有任何建议吗?

1 个答案:

答案 0 :(得分:2)

作为500 - 内部服务器错误说,Pascal字符串是从1开始的。您对插槽零的引用正在返回垃圾。如果这些是256字节的字符串,你得到长度代码,我不记得基于指针的字符串的内存布局,知道你在这种情况下得到了什么。你也因此失去了每个字符串的最后一个字符。

除此之外,我看到了一个明确的错误:看看以/

结尾的行会发生什么

我也不明白这一点:

            if(i = Length(TString) - 1) Then
                begin
                Write(TString[i + 1]);
                end;

在我看来,它正在写一个额外的角色,但我不确定。