我有以下代码:
program main
character (len=15) :: abc = "te st tex t"
print *, trim(abc)
end program main
哪个输出:
te st tex t
我除了要删除的所有空格,但它不是。如何从字符串中删除所有空格?
答案 0 :(得分:3)
修剪将仅删除边缘处的空格,而不是中间(这是几乎所有语言/库中的常见行为)。如果要删除字符串中的所有空格,则必须创建自己的函数来迭代字符串。
例:
program Test
implicit none
! Variables
character(len=200) :: string
! Body of Test
string = 'Hello World 7 9'
print *, string
call StripSpaces (string)
print *, string
contains
subroutine StripSpaces(string)
character(len=*) :: string
integer :: stringLen
integer :: last, actual
stringLen = len (string)
last = 1
actual = 1
do while (actual < stringLen)
if (string(last:last) == ' ') then
actual = actual + 1
string(last:last) = string(actual:actual)
string(actual:actual) = ' '
else
last = last + 1
if (actual < last) &
actual = last
endif
end do
end subroutine
end program Test
这是在intel编译器上测试的,而不是在gfortran上,但我认为它会起作用。
答案 1 :(得分:2)
这是一种消除空间的肮脏,可耻的方式。这只有在编译器以与15个元素的字符数组相同的顺序和空间布置长度为15的字符串时才有效。虽然这可能是真的,并且在我最近的经验中是真实的,但并不能保证标准是如此。除此之外,这种方法可能还不错。
! declarations
CHARACTER (len=15) :: abc = "te st tex t"
CHARACTER, DIMENSION(LEN(abc)) :: abc_array
! or CHARACTER, DIMENSION(:), ALLOCATABLE :: abc_array if your compiler supports
! automatic allocation
! transfer the string into an array of characters
abc_array = TRANSFER(abc,abc_array)
! eliminate the spaces, and transfer back to the string
abc = TRANSFER(PACK(abc_array,abc_array/=' '),abc)
! now all the spaces are at the end of abc so the following statement writes the
! string with no spaces
WRITE(*,*) TRIM(abc)
使用此方法需要您自担风险。
答案 2 :(得分:1)
我能够使用此处描述的变量字符串库(http://schonfelder.co.uk/is1539-2-99.htm)来完成此操作。源代码链接可在ISO文档的介绍部分找到。
这是代码
程序Console1 使用ISO_VARYING_STRING 隐含无
! Body of Console1
character(LEN=50) :: text = 'Hello World John Mary '
character(LEN=50) :: res
print *, trim(text)
! 'Hello World John Mary'
res = REPLACE(text,' ','', every=.TRUE.)
print *, trim(res)
! 'HelloWorldJohnMary'
end program Console1
答案 3 :(得分:0)
对于那些厌恶TRANSFER
的人来说,也许一个不错的小递归函数会吸引人。如上所述,这取决于Fortran 2003自动分配字符标量的能力,但如果您的编译器还不支持此功能,则不应该太难修改。
RECURSIVE FUNCTION stripper(string,ch) RESULT(stripped)
CHARACTER(len=*), INTENT(in) :: string
CHARACTER, INTENT(in) :: ch
CHARACTER(:), ALLOCATABLE :: stripped
IF (LEN(string)==1) THEN
IF (string==ch) THEN
stripped = ''
ELSE
stripped = string
END IF
ELSE
IF (string(1:1)==ch) THEN
stripped = stripper(string(2:),ch)
ELSE
stripped = string(1:1)//stripper(string(2:),ch)
END IF
END IF
END FUNCTION stripper
答案 4 :(得分:0)
你可以试试这个:
program test
!erase blank space in a string
!run over every character of the string and just take every non-blank in other variable.
implicit none
character (len=100) str1,str2
integer i
str2='' !in this variable will be save non-blank spaces
str1=' a b c de ' !Test string with blank spaces
write(*,*)len_trim(str1), str1
do i=1,len(str1)
if (str1(i:i).ne.' ')str2=trim(str2)//trim(str1(i:i))
end do
write(*,*)len_trim(str2), str2
end