Fortran程序字符串无法复制到tokens数组问题求助
Fortran词元分割程序故障修复
你遇到的子串无法复制到tokens数组的问题,本质是两处逻辑错误叠加导致的,和内存分配、字符串赋值的底层机制无关:
- 最终打印循环的索引书写错误:你在遍历打印tokens的循环中,循环变量是
i,但取值时写的是tokens(tidx),等于循环全程都在读取tidx对应位置的同一个数组元素,前面已经存入的其他词元根本没有被访问到,才会误以为赋值失败。 - 词元截取的边界逻辑错误:遇到空格时你截取的子串包含当前空格字符,且下一个词元的起始位置直接设为空格所在位置,会导致每个存入的token尾部带空格、下一个token头部带空格;同时循环终止条件是
i < x,文件末尾最后一个词元因为碰不到后续空格,根本不会被存入数组。
另外还有一个容易忽略的Fortran字符串特性:你定义的tokens数组每个元素是固定32字节长度,给这类固定长度字符串赋值时,若源串短于32字节,尾部会自动补空格,打印时如果不用trim()函数去掉尾部空格,会看到大量无意义的留白。
修复方案
直接替换原代码中扫描词元、打印结果的对应段落即可:
! scan tidx = 1 start = 1 i = 1 do while (i <= x) if (tidx >= 256) then print *, "token limit reached" stop 4 end if c = content(i:i) ! 空格、制表符、回车、换行均视为分隔符 if (c.eq.' ' .or. c.eq.char(9) .or. c.eq.char(10) .or. c.eq.char(13)) then if (i > start) then ! 跳过连续分隔符生成的空token tokens(tidx) = content(start:i-1) tidx = tidx + 1 end if start = i + 1 end if i = i + 1 end do ! 补存文件末尾最后一个无后续分隔符的词元 if (start <= x .and. tidx <= 256) then tokens(tidx) = content(start:x) tidx = tidx + 1 end if print *, "total tokens count: ", tidx-1 do i = 1, tidx-1 ! 索引用循环变量i,trim()去掉固定长度字符串尾部自动补的空格 print *, "token: '", trim(tokens(i)), "'" end do
原因补充
你之前在循环内直接打印content(start:i)能正常输出,是因为这一步直接读取的是content的动态子串,既没有走数组赋值流程,也没有用到错误的打印索引,所以表现正常。原代码中tokens数组的内存分配本身没有语法问题,不需要修改allocate相关逻辑。
内容的提问来源于stack exchange,提问作者Skye Bleed
相关产品推荐
相关产品推荐

