删除字符串中的空格

时间:2014-11-27 22:37:06

标签: fortran trim fortran90 gfortran

我有以下代码:

  program main
     character (len=15) :: abc = "te st tex  t"
     print *, trim(abc)      
  end program main

哪个输出:

 te st tex  t

我除了要删除的所有空格,但它不是。如何从字符串中删除所有空格?

5 个答案:

答案 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