如何重复一个字符串以匹配另一个字符串的长度?
How do I repeat one string to match the length of another string?
我正在尝试重复字符串 "k" 以匹配 "text" 的长度而不超出长度。所以它会输出 "treetreetreetreetreet" 而不是 "treetreetreetreetreetree"。除了输出比需要更多的字符之外,我真的不知道从哪里开始。
PROGRAM test
IMPLICIT NONE
CHARACTER*30 :: text, k
INTEGER :: times
text = 'hello my name is anon'
k = 'tree'
times = (LEN_TRIM(text)/LEN_TRIM(k)) + 1
WRITE(*,*) REPEAT(k,times)
END PROGRAM test
首先,您的示例程序并没有像您期望的那样生成 treetreetreetreetreetree
,它实际上生成了 tree tree tree ...
。当您将字符串 k
传递给 REPEAT
时,tree
之后的空格也会重复。您应该 trim 重复之前的字符串,例如 REPEAT(trim(k),times)
.
有几种方法可以解决您的主要问题 - 我建议使用您目前已有的方法,但将最终结果减少到您想要的长度 - 在本例中 LEN_TRIM(text)
。这样做的一个好方法是将 REPEAT
的输出存储在一个临时变量中,并仅输出此最终字符串的一个子集。
通过这些修改和一些其他清理,您的代码如下所示:
program main
implicit none
character(len=30) :: text, k, str
integer :: times
text = 'hello my name is anon'
k = 'tree'
times = (LEN_TRIM(text)/LEN_TRIM(k)) + 1 ! -- Note integer division
str = REPEAT(trim(k),times)
write(*,*) str(1:LEN_TRIM(text))
end program main
给出所需的输出
> gfortran main.f90 && ./a.out
treetreetreetreetreet
我正在尝试重复字符串 "k" 以匹配 "text" 的长度而不超出长度。所以它会输出 "treetreetreetreetreet" 而不是 "treetreetreetreetreetree"。除了输出比需要更多的字符之外,我真的不知道从哪里开始。
PROGRAM test
IMPLICIT NONE
CHARACTER*30 :: text, k
INTEGER :: times
text = 'hello my name is anon'
k = 'tree'
times = (LEN_TRIM(text)/LEN_TRIM(k)) + 1
WRITE(*,*) REPEAT(k,times)
END PROGRAM test
首先,您的示例程序并没有像您期望的那样生成 treetreetreetreetreetree
,它实际上生成了 tree tree tree ...
。当您将字符串 k
传递给 REPEAT
时,tree
之后的空格也会重复。您应该 trim 重复之前的字符串,例如 REPEAT(trim(k),times)
.
有几种方法可以解决您的主要问题 - 我建议使用您目前已有的方法,但将最终结果减少到您想要的长度 - 在本例中 LEN_TRIM(text)
。这样做的一个好方法是将 REPEAT
的输出存储在一个临时变量中,并仅输出此最终字符串的一个子集。
通过这些修改和一些其他清理,您的代码如下所示:
program main
implicit none
character(len=30) :: text, k, str
integer :: times
text = 'hello my name is anon'
k = 'tree'
times = (LEN_TRIM(text)/LEN_TRIM(k)) + 1 ! -- Note integer division
str = REPEAT(trim(k),times)
write(*,*) str(1:LEN_TRIM(text))
end program main
给出所需的输出
> gfortran main.f90 && ./a.out
treetreetreetreetreet