【问题标题】:Pascal - Writing Strange Characters帕斯卡 - 写奇怪的字符
【发布时间】: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


【解决方案1】:

正如 500 - Internal Server Error 所说,Pascal 字符串是从 1 开始的。您对插槽零的引用正在返回垃圾。如果这些是 256 字节的字符串,您将获得长度代码,我不记得基于指针的字符串的内存布局,以了解在这种情况下您会得到什么。因此,您还会丢失每个字符串的最后一个字符。

除此之外,我看到了一个明确的错误:看看以 / 结尾的行会发生什么

这个我也不明白:

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

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

【讨论】:

  • 基于 1 是导致我的问题的原因。以“/”结尾的代码会导致问题。为简单起见,我假设所有 C 代码的格式都正确。我相信 C 代码不可能以“/”结尾并编译。另外,因为有时我使用 i + 1 来索引 TString,所以我只能运行 i = 0 to Length(TString) - 1。这意味着TString[Length(TString)] 必须在i = Length(TString) - 1 时打印。感谢您的帮助,非常感谢。
  • @MattyChuck 这不是编程的工作方式。您不能仅仅忽略字符,因为有时提到它们会爆炸。你必须改正你的逻辑。
  • 我认为你误会了,我没有忽略任何字符。如果我的倒数第二个字符不在评论中或评论的开头,那么我在该行中的最后一个字符肯定也不是。无论如何,我的评论剥离器在这一点上完美无缺。但感谢您的关注。
  • @MattyChuck 哦,我明白你在做什么了——你根本没有检查最后一个字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-23
  • 2014-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多