为什么 trim(" ") == "" returns 在 Fortran 中为假?
Why does trim(" ") == "" returns false in Fortran?
我遇到随机的不连贯...在某些情况下,trim(" ") == "" returns false。
我做了这样的事情(所以是一种使用类型的连接函数)当然这段代码有点乱可以做很多简化但是因为这个 trim 问题我这样做了确保没有任何混乱:
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
此代码有时有效,有时无效...(我的意思是我还有其他空变量,我只遇到一些变量的问题)我认为 space 字符已加密,因为在调试中模式我有像 "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)) 正在做一个 trim of 150 NULL。
我创建了这个函数来解决这个问题:
logical function isNULL(var)
implicit none
Character *(*) :: var
logical :: ret
ret = ichar(var(1:1)) .eq. 0
isNULL = ret
return
end function
函数 TRIM
执行:
7.170 TRIM (STRING)
Description: String without trailing blanks.
Class: Transformational function.
Argument: STRING
shall be a character scalar.
Result Characteristics: Character with the same kind type parameter value as STRING
and with a length that is the length of STRING
less the number of trailing blanks in STRING
. If STRING
contains no nonblank
characters, the result has zero length.
Result Value: The value of the result is the same as STRING
except any trailing blanks are removed.
Example: TRIM (" A B ")
has the value " A B"
.
source: Fortran 2008 Standard
如您所见,单词 blank 在此定义中出现了很多,在相应的字符集中代表白色 space。
我怀疑您正在处理来自具有 CRLF 行终止的 DOS 框的数据。或字符串末尾的任何其他不可打印字符。您可以通过打印字符串的每个字符及其对应的 ASCII 码来验证这一点。
例如,如果您的字符串是 str
:
do i=1,len(str)
print *, ichar(str(i:i)), ">"//str(i:i)//"<"
done
whitespace 字符的值应该是 32。如果你有不同的值,你可以看这里:http://www.asciitable.com/
我遇到随机的不连贯...在某些情况下,trim(" ") == "" returns false。
我做了这样的事情(所以是一种使用类型的连接函数)当然这段代码有点乱可以做很多简化但是因为这个 trim 问题我这样做了确保没有任何混乱:
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
此代码有时有效,有时无效...(我的意思是我还有其他空变量,我只遇到一些变量的问题)我认为 space 字符已加密,因为在调试中模式我有像 "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)) 正在做一个 trim of 150 NULL。
我创建了这个函数来解决这个问题:
logical function isNULL(var) implicit none Character *(*) :: var logical :: ret ret = ichar(var(1:1)) .eq. 0 isNULL = ret return end function
函数 TRIM
执行:
7.170
TRIM (STRING)
Description: String without trailing blanks.
Class: Transformational function.
Argument:STRING
shall be a character scalar.
Result Characteristics: Character with the same kind type parameter value asSTRING
and with a length that is the length ofSTRING
less the number of trailing blanks inSTRING
. IfSTRING
contains no nonblank characters, the result has zero length.
Result Value: The value of the result is the same asSTRING
except any trailing blanks are removed.
Example:TRIM (" A B ")
has the value" A B"
.source: Fortran 2008 Standard
如您所见,单词 blank 在此定义中出现了很多,在相应的字符集中代表白色 space。
我怀疑您正在处理来自具有 CRLF 行终止的 DOS 框的数据。或字符串末尾的任何其他不可打印字符。您可以通过打印字符串的每个字符及其对应的 ASCII 码来验证这一点。
例如,如果您的字符串是 str
:
do i=1,len(str)
print *, ichar(str(i:i)), ">"//str(i:i)//"<"
done
whitespace 字符的值应该是 32。如果你有不同的值,你可以看这里:http://www.asciitable.com/