查找字符串数组中的字符串值
我在Fortran程序中有一个字符串数组。 不是单个字符串。我知道数组中的一个值是“foo”。我想知道包含“foo”的数组的索引。有没有办法找到比强力循环以外的索引?我显然不能使用“minloc”例程,因为我没有在这里处理数字。再次,只是为了确保:我不是在字符串中搜索子字符串。我正在搜索一个字符串数组中的字符串。查找字符串数组中的字符串值
implicit none
integer i
character*8 a(100)
do i = 1,100
a(i)='foo'
enddo
a(42)='bar'
call f(a,len(a(1)),shape(a)*len(a(1)),'bar ')
end
subroutine f(c,n,all,s)
implicit none
integer n,all
character*(*) s
character*(all) c
write(*,*)index(c,s)/n+1
end
a.out -> 42
请注意,此代码将整个数组视为一个大字符串并搜索子字符串,以便它还会查找与组件字符串边界不匹配的匹配项。
例如。
a(2)='xxbar '
a(3)=' yyy'
,以确保您找到一个index
是n的整数倍需要一些额外的工作(由时间,当然你做一个简单的循环可能看起来更好):错误匹配与相邻的条目,如发生
对于“额外的工作”,大概意思是处理像'call f(['fob','arb','bar'],3,9 ,'bar')'? [在您的电话中缺少一个参数。] – francescalus 2015-02-24 20:31:59
哎呀,感谢您的支持。 – agentp 2015-02-24 20:33:01
好吧,想到它后,我想出了这个。它的工作原理,如果“foo”被称为是无论是从阵列缺席,或位于一个且只有一个地方:
character(len=3) :: tags(100)
integer :: test(100)
integer :: str_location
! populate "tags" however needed. Then search for "foo":
test=(/(i,i=1,100)/)
where (tags.ne."foo") test=0
str_location = sum(test)
我猜这实际上比蛮力循环更慢,但它使紧凑型码。我想过用“max test”来填充“测试”,但是这并没有说明阵列中没有“foo”的可能性。意见?
如果你想在没有'findloc'的情况下使用“compact”,那么'minval(pack([(i,i = 1,100)],tags.eq.'foo'))''。但这不是一个好方法。 – francescalus 2015-02-25 23:00:06
[不是一个非常有用的评论,但:'findloc'工程字符数组? [这不是F90,也没有广泛实施。] – francescalus 2015-02-24 18:44:16