Pascal 帕斯卡-书写奇怪的字符

Pascal 帕斯卡-书写奇怪的字符,pascal,freepascal,Pascal,Freepascal,我正在尝试用pascal编写注释剥离器。我运行我的代码并向它传递一个C源代码文件,它从文件中删除注释并将结果打印到终端 我对帕斯卡相当陌生。我得到一些非常奇怪的输出,我不知道为什么。代码逐行检查注释,并一次打印一个字符。每当到达新行的开头时,注释剥离器就会打印似乎是随机字符的内容。我正在使用pascals Write(Str[I])函数打印字符,并在到达行尾时写入() 我不知道我为什么会收到奇怪的输出。我正在运行LinuxMint,可以编译和运行我的代码,但我收到了这个奇怪的输出。我还尝试在Ma

我正在尝试用pascal编写注释剥离器。我运行我的代码并向它传递一个C源代码文件,它从文件中删除注释并将结果打印到终端

我对帕斯卡相当陌生。我得到一些非常奇怪的输出,我不知道为什么。代码逐行检查注释,并一次打印一个字符。每当到达新行的开头时,注释剥离器就会打印似乎是随机字符的内容。我正在使用pascals Write(Str[I])函数打印字符,并在到达行尾时写入()

我不知道我为什么会收到奇怪的输出。我正在运行LinuxMint,可以编译和运行我的代码,但我收到了这个奇怪的输出。我还尝试在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块,如找到的字符


有人有什么建议吗?

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

除此之外,我还看到了一个明确的bug:看看一行以/

我也不明白这一点:

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

在我看来,它似乎在写一个额外的字符,但我不确定。

在Pascal中,字符串通常是基于1的。
if(TString[I+1]
:可能会导致范围错误。您应该累积标识符并测试其值。导致我出现问题的原因是基于1的。以“/”结尾的代码会导致问题。为简单起见,我假设所有C代码的格式都正确。我相信C代码不可能以“/”结尾并进行编译。另外,因为我使用I+1索引TString有时,我只能运行
I=0到长度(TString)-1
。这意味着
TString[Length(TString)]
必须在
I=Length(TString)时打印-1
。谢谢你的帮助,非常感谢。@MattyChuck这不是编程的工作方式。你不能忽略字符,因为有时引用字符会出错。你必须修正你的逻辑。我想你是误解了,我不会忽略任何字符。如果我最后的第二个字符不在评论中或一篇文章的开头注释,我在这行的最后一个字符肯定不能是。无论如何,我的注释剥离器在这一点上工作得完美无缺。但是谢谢你的关心。@MattyChuck哦,我明白你在做什么了——你根本没有检查最后一个字符。