首页 > 解决方案 > 在来自文本文件的字符串的特定索引中搜索特定字符时出错(计算文本文件中的段落)

问题描述

我在文本文件中搜索特定字符时遇到问题。问题来自计算文本文件中的段落的任务。这个想法很明显 - 文本文件中的两个段落被一个空白行分隔,这意味着该行中的第一个字符是 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 过程中工作并且我使用相同的想法 - 搜索动态数组对于特定的字符。但是在这里我需要在该行的第一个索引中搜索特定字符。为什么上述程序段落不起作用?关于如何更正该过程以使其显示文本文件中的段落数的任何想法?

标签: arraystext-filespascallazarusparagraph

解决方案


你正在以错误的方式解决这个问题。

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

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


推荐阅读