在来自文本文件的字符串的特定索引中搜索特定字符时出错(计算文本文件中的段落)

时间:2019-07-04 19:23:59

标签: arrays text-files pascal lazarus paragraph

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

这个想法很明显-文本文件中的两个段落用空行分隔,这意味着该行中的第一个字符为ASCII#13,因此如果我创建了遍历文本文件中每一行的过程,并且该行中的第一个字符是ASCII#13,然后计数器增加1。但是,当我执行此操作时,我在运行该程序时收到了外部: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过程中使用并且我使用的是相同的想法-搜索一个特定字符的动态数组。但是在这里,我需要在该行的第一个索引中搜索特定字符。为什么上述程序段落不起作用?关于如何更正该过程以使其在文本文件中显示段落数的任何想法?

1 个答案:

答案 0 :(得分:0)

这是错误的做法。

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

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