从Fortran中的字符串中提取整数

时间:2014-01-26 22:35:41

标签: arrays string integer fortran

我正在使用Fortran 90.我有一个声明为CHARACTER(20) :: Folds的字符串,它从一个看起来像x:y:z的命令行参数中赋值,其中x,y和z都是整数。然后我需要从该字符串中挑出数字并将它们分配给适当的变量。这就是我尝试这样做的方式:

 i=1
 do j=1, LEN_TRIM(folds)
    temp_fold=''
    if (folds(j).neqv.':') then
        temp_fold(j)=folds(j)
    elseif (i.eq.1) then
        read(temp_fold,*) FoldX    
        i=i+1
    elseif (i.eq.2) then
        read(temp_fold,*) FoldY 
        i=i+1
    else
        read(temp_fold,*) FoldZ 
    endif
 enddo

当我编译这个时,我得到错误:

unfolder.f90(222):错误#6410:此名称尚未声明为数组或函数。 [FOLDS]

[stud2 @feynman vec2ascii] $ if(folds(j).neqv。':')then 意外令牌`j'附近的语法错误 [stud2 @ feynman vec2ascii] $ -------- ^

unfolder.f90(223):错误#6410:此名称尚未声明为数组或函数。 [TEMP_FOLD]

[stud2 @ feynman vec2ascii] $ temp_fold(j)= folds(j)

意外标记“j”

附近的语法错误

如何提取这些数字?

2 个答案:

答案 0 :(得分:2)

您可以使用index内在函数来定位第一个冒号的字符串中的位置,例如i。然后使用内部读取从前面的子字符串中读取整数xread (string (1:i-1), *) x。然后将此过程应用于从i+1开始的子字符串以获取y。重复z

P.S。您的错误消息来自bash而不是Fortran编译器吗?

答案 1 :(得分:1)

使用folds字符变量,要访问子字符串,需要(.:.)。也就是说,要访问索引为j的单个字符:folds(j:j)

如果没有这个,编译器认为folds必须是一个数组(它不是)或一个函数(不是你想要的)。这就是:

  

此名称尚未声明为数组或函数。

但就解决你的问题而言,我是@ M.S.B给出的答案。因为它更优雅。此外,循环原样((j:j)folds中的temp_fold更正),您依赖于每个x,y和z是单个数字整数。这个答案更为笼统。