You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fortran程序字符串无法复制到tokens数组问题求助

Fortran词元分割程序故障修复

你遇到的子串无法复制到tokens数组的问题,本质是两处逻辑错误叠加导致的,和内存分配、字符串赋值的底层机制无关:

  1. 最终打印循环的索引书写错误:你在遍历打印tokens的循环中,循环变量是i,但取值时写的是tokens(tidx),等于循环全程都在读取tidx对应位置的同一个数组元素,前面已经存入的其他词元根本没有被访问到,才会误以为赋值失败。
  2. 词元截取的边界逻辑错误:遇到空格时你截取的子串包含当前空格字符,且下一个词元的起始位置直接设为空格所在位置,会导致每个存入的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 04:06:20