0

我正面临着随机的不连贯……在某些情况下,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 值时:

    修剪(var):
    len_trim(var) : 150
    修剪(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 >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 > 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 > 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 的修剪。

我创建了这个函数来解决这个问题:

      逻辑函数 isNULL(var)
          隐式无
          字符 *(*) :: var
          逻辑 :: ret
          ret = ichar(var(1:1)) .eq. 0
          isNULL = ret
          返回
      结束函数
4

1 回答 1

1

该函数TRIM执行以下操作:

7.170TRIM (STRING)
描述:没有尾随空格的字符串。
类:转换函数。
参数: STRING应为字符标量。
结果特征:与类型参数值相同且长度为中的尾随空格数STRING的长度减去的字符。如果不包含非空白字符,则结果长度为零。结果值:除了删除任何尾随空格之外,结果的值相同。示例:具有值.STRINGSTRINGSTRING
STRING
TRIM (" A B ")" A B"

来源:Fortran 2008 标准

正如您所注意到的,这个定义中出现了很多单词blank,并且在相应的字符集中表示一个空格。

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

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

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

空白字符的值应该是 32。如果你有不同的值,你可以看看这里:http ://www.asciitable.com/

于 2019-03-22T10:55:43.080 回答