【问题标题】:Error when searching for a specific character in a specific index of a string that comes from a textfile(counting paragraphs in a textfile)在来自文本文件的字符串的特定索引中搜索特定字符时出错(计算文本文件中的段落)
【发布时间】:2019-07-04 19:23:59
【问题描述】:

我在文本文件中搜索特定字符时遇到问题。问题来自计算文本文件中的段落的任务。这个想法很明显 - 文本文件中的两个段落被一个空白行分隔,这意味着该行中的第一个字符是 ASCII#13,所以如果我创建一个通过的过程

这个想法很明显 - 文本文件中的两个段落被一个空行分隔,这意味着该行中的第一个字符是 ASCII#13,所以如果我创建一个遍历文本文件中每一行的过程,并且如果行中的第一个字符是 ASCII#13,然后计数器增加 1。但是当我这样做时,我在运行程序时得到一个 external: SIGSEGV 错误。这是代码 -

procedure paragraphs(name:string) ;
var
line:string;
paragraphs:integer;
file:textfile
begin
assignfile(file, name)     ;
reset(file);
paragraphs:=0;
while not eof(file) do
   begin
     readln(file,line);
     if line[1]=#13  then     //here is the error
     paragraphs:=paragraphs+1;
   end;
end; 

现在奇怪的是,我有一个非常相似的程序来计算单词的总数,它在相同的基础上工作并且工作正常,没有错误

procedure words(name:string);
var 
insideword:boolean  ;
x,words:integer;
file:textfile;
line:string;
begin
assignfile(file, name);
reset(file);
words:=0;
while not eof(file) do
begin
  insideword:=false;
readln(file,line);
for x:=1 to length(line) do
begin
if line[x]=' ' then insideword:=false   //no problem here
else begin
if insidewords=false then words:=words+1;
insidewords:=true;
end;
end;
end;
end;

我认为字符串基本上是 char 数组,但我认为在这种情况下字符串是动态数组会阻止我使用特定索引,尽管它基本上在 Words 过程中有效,而且我使用相同的想法 - 搜索特定字符的动态数组。但是在这里我需要在该行的第一个索引中搜索特定字符。为什么上述程序段落不起作用?关于如何更正该过程以使其显示文本文件中的段落数的任何想法?

【问题讨论】:

  • 您永远不会在这些字符串中看到换行符。曾经。这就是 ReadLn 的意义所在。考虑学习调试。如果您检查变量,您将看到它们包含的内容。

标签: arrays text-files pascal lazarus paragraph


【解决方案1】:

你做错了。

ReadLn 不返回行尾字符,因此当您尝试访问空行的第一个字符时,您会遇到访问冲突,因为没有“第一个”字符可以通过 @ 访问987654322@。如果您真的想逐个字符地访问文件,请使用Read() 而不是ReadLn()

要根据 q 的标题搜索字符串,请使用 Pos() 函数在字符串中搜索字符或子字符串。请参阅 OLH 了解用法。

【讨论】:

  • 嗯,我明白了。我认为将错误行更改为 if Pos(#13,line)=1 then paragraphs:=paragraphs+1; 这样的东西会起作用,但它显示为零,即使文本文件有 2 个段落。
  • 好吧,尽管readLn 的全部意义在于让您摆脱不断寻找行尾字符的苦差事。
  • ReadLn()更改为Read()会使程序在持续运行时不返回任何内容,以及添加while not eoln(file),所以我必须使用ReadLn()
  • @Johnny 是的,使用 ReadLn() 但如果长度为 0 并且您不在 eof 中,则使用 Length(line) 而不是 line[1]...,它必须是一个新段落。
  • ReadLn() 存在时,我认为只有受虐狂才会使用Read() 来为您完成艰苦的工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-28
  • 1970-01-01
  • 1970-01-01
  • 2013-03-13
  • 2012-05-25
相关资源
最近更新 更多