2015-02-24 139 views
0

我在Fortran程序中有一个字符串数组。 不是单个字符串。我知道数组中的一个值是“foo”。我想知道包含“foo”的数组的索引。有没有办法找到比强力循环以外的索引?我显然不能使用“minloc”例程,因为我没有在这里处理数字。再次,只是为了确保:我不是在字符串中搜索子字符串。我正在搜索一个字符串数组中的字符串。查找字符串数组中的字符串值

+0

[不是一个非常有用的评论,但:'findloc'工程字符数组? [这不是F90,也没有广泛实施。] – francescalus 2015-02-24 18:44:16

回答

1
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的整数倍需要一些额外的工作(由时间,当然你做一个简单的循环可能看起来更好):错误匹配与相邻的条目,如发生

+0

对于“额外的工作”,大概意思是处理像'call f(['fob','arb','bar'],3,9 ,'bar')'? [在您的电话中缺少一个参数。] – francescalus 2015-02-24 20:31:59

+0

哎呀,感谢您的支持。 – agentp 2015-02-24 20:33:01

0

好吧,想到它后,我想出了这个。它的工作原理,如果“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”的可能性。意见?

+0

如果你想在没有'findloc'的情况下使用“compact”,那么'minval(pack([(i,i = 1,100)],tags.eq.'foo'))''。但这不是一个好方法。 – francescalus 2015-02-25 23:00:06