为什么trim(“”)==“”在Fortran中返回false?

时间:2019-03-20 09:40:43

标签: null fortran trim nonblank

我正面临随机不一致性...在某些情况下,trim(“”)==“”返回false。

我做了这样的事情(这样使用类型的连接函数),当然这段代码有点混乱,可以做很多简化,但是由于这个修整问题,我这样做是为了确保什么都不做混乱:

character*150 :: tab(5)
character*150 :: var
character*50 :: a
character*50 :: b
character*50 :: c
character*50 :: d
a= '' ! comes from a type nameType%pref
b= '' ! parameter
c= '' ! comes from a type nameType%suf
d= 'deviceName' ! parameter
if (trim(d) .ne. '') then
    var = d
else
    if (trim(c) .ne. ''  .and. (trim(a) .ne. '' .or. trim(b) .ne. ''))then
            var = trim(a)//trim(c)//trim(b)
    else
        var = ''
    end if
end if
var = trim(a)//trim(b)//trim(c)
tab(1) = var
if (trim(tab(1)) .eq. '') then
     print*, ("hi")
end if

这是此函数结尾的出口:

trim(var) :
len_trim(var) :            0 
trim(var) == " : T

这段代码有时可以工作,有时却不行。。。(我是说我还有其他空变量,我只用一些变量来面对这个问题)我认为空格字符是加密的,因为在调试模式下,我有一些随机值,例如“pÏ” ...

这是错误打印时的出口,当我要求ASCII值时:    

    trim(var) : 
    len_trim(var) :          150
    trim(var) == " : F
    ichar(var(j:j)), ">"//var(j:j)//"<"
           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >           0 >
    

因此trim(tab(i))正在修剪150 NULL。

我创建了此函数来解决该问题:

      logical function isNULL(var)
          implicit none
          Character *(*) :: var
          logical :: ret
          ret = ichar(var(1:1)) .eq. 0
          isNULL = ret
          return 
      end function

1 个答案:

答案 0 :(得分:1)

函数TRIM可以做到:

  

7.170 TRIM (STRING)
  说明:不带空格的字符串。
  类:转换函数。
  参数STRING应该是字符标量。
  结果特征:具有与STRING相同类型类型参数值且长度为STRING的字符减去STRING中尾随空白的字符。如果STRING不包含非空白   字符,结果长度为零。
  结果值:结果值与STRING相同,只是除去了所有尾随空白。
  示例TRIM (" A B ")的值为" A B"

     

来源:Fortran 2008 Standard

您注意到,在此定义中,单词空白出现很多,并在各个字符集中表示空格。

我的怀疑是您正在处理来自具有CRLF线路终端的DOS盒的数据。或字符串末尾的任何其他不可打印的字符。您可以通过打印字符串的每个字符及其对应的ASCII码来验证这一点。

例如,如果您的字符串是str

   do i=1,len(str)
      print *, ichar(str(i:i)), ">"//str(i:i)//"<"
   done

空格字符应具有值32。如果您具有不同的值,则可以在这里查看:http://www.asciitable.com/