如何在Fortran中合并两个字符串

7
以下是我想在Fortran中实现的Python3示例:

下面是一个Python3示例,展示了我想在Fortran中实现的内容:

str1 = "Hello"
str2 = " World!"
print(str1 + str2)

# And then the result would be "Hello World!"

当我执行以下操作时:
print "(A)", str1, str2

它会将其放置在单独的一行上。如果有人知道如何帮忙,请回答。
4个回答

9

对于字符串连接的字面答案,可以使用//运算符,在另一个答案中有详细介绍。特别注意,你可能想要 TRIM 第一个参数。

但是你的问题提出了另一个有趣的概念,那就是格式回退

使用格式(A),我们有一个格式项。在输出列表str1,str2中,有两个输出项。在一般的输出语句中,我们将每个格式项(带重复计数)应用于相应的输出项。因此,str1会被第一个格式项A处理,并显示一个字符串。

当到达第二个输出项str2时,我们已经使用了单个格式项,到达了格式项列表的末尾。结果是看到了这种格式回退:也就是说,我们返回到列表中的第一项。此后,至关重要的是,我们开始一个新行。

因此,如果我们只想将这两个项目打印到一行上(它们之间没有空格或空行),我们可以使用以下方法(为了清晰起见忽略修剪):

print "(A)", str1//str2

或者我们可以使用一种没有这种反转的格式。
print "(2A)", str1, str2
print "(A, A)", str1, str2

第一个示例将这两个字符变量连接起来,形成一个更长的变量,并将其作为单个输出项打印。第二个示例分别打印这两个变量。
针对你提供的特定示例:
character(12), parameter :: str1="Hello"    ! Intentionally longer - trailing blanks
character(12), parameter :: str2=" World!"

print "(2A)", TRIM(str1), TRIM(str2)
end

将会产生类似于以下的输出:
Hello World!

由于TRIM不会删除str2中的前导空格,因此需要加上中间空格。虽然在输出中没有前导空格,但我们希望将其添加到输出中。

当然,连接仍然有效(假设不修剪)。

character(*), parameter :: str1="Hello"    ! No trailing blank
character(*), parameter :: str2="World!"

print "(A)", str1//" "//str2
end

但是我们可以选择使用X编辑描述符来添加一个空格,以便更好地格式化。

print "(2(A,1X))", str1, str2
print "(A,1X,A)", str1, str2
print "(2(A,:,1X))", str1, str2

这个最终的示例中包含有用的冒号编辑描述符(超出了本答案的范围)。

谢谢,现在它在同一行上打印,但字符串之间有很大的空格。我想除了一个空格外,将所有空格都修剪掉。 - Prince
感谢您的帮助。 - Prince

3

2

看起来这个已经被覆盖了,但如果你想在同一行上打印很多数据,另一个有用的功能是以下内容:

character(len=32),dimension(100) :: str    

do i=1,100
  write(*,fmt="(A)", advance='no') str(i)
end do
write(*,*) ! to go to the next line when you are done

由于advance='no',这将在同一行上打印100个字符。

你的字符子串语法是错误的。同时不要忘记在结尾处完成记录。 - Vladimir F Героям слава
我怀疑他想使用一个字符串数组。@MarkS,你应该添加str的声明以澄清。 - agentp
编辑后的内容,根据评论留下了更少的想象空间。 - Mark S
我想指出的是,目前这个形式并不是每行打印100个字符,而是每行打印100个单词。如果你想要字符,你需要使用一个长字符串,或者使用双索引逐个输出字符,但这将需要对代码进行额外的修改。 - Alija Bevrnja
我想指出的是,目前的形式下,每行并不是打印100个字符,而是100个单词。如果你想要字符,你需要使用一个长字符串,或者使用双索引逐个输出字符,但这将需要对代码进行额外的修改。 - undefined

0

你可以使用另一个变量将它们放入其中,并在该新变量中编写这两个字符串:

Program combineString
    character(len=100) :: text1, text2, text

    text1 = "Hello,"
    text2 = "My name is X"

    write(text,'(A6, X, A20)') text1, text2

    write(*,*) text

End Program

输出为:

Hello, My name is X  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接