Kon*_*559 3 string fortran gfortran
我是Fortran的科学家编程,我想出了一个奇怪的行为.在我的一个程序中,我有一个包含几个"单词"的字符串,我想将所有单词作为子字符串读取.第一个单词以整数和通配符开头,如"2*something".
当我对该字符串执行内部读取时,我希望读取所有wod,但是READ函数会重复读取第一个子字符串.我不明白为什么,也不知道如何避免这种行为.
下面是一个再现这种行为的极简主义示例程序.我希望它能读取三个子串并在屏幕上打印"3*ab c".相反,我得到了"aa a".
我究竟做错了什么?你能帮我解释一下发生了什么吗?
我正在使用Gfortran 7.3(7.3.0-27ubuntu1~18.04)在GNU/Linux x64下编译我的程序.
PROGRAM testread
IMPLICIT NONE
CHARACTER(LEN=1024):: string
CHARACTER(LEN=16):: v1, v2, v3
string="3*a b c"
READ(string,*) v1, v2, v3
PRINT*, v1, v2, v3
END PROGRAM testread
Run Code Online (Sandbox Code Playgroud)
您正在使用列表定向输入(*格式说明符).在列表导向的输入中,数字(n)后跟星号表示"重复此项n次",因此处理就像输入一样a a a b c
.您需要输入'3*a' b c
才能获得所需内容.
我将用另一个机会指出列表导向的I/O有时是错误的选择,因为它固有的灵活性可能不是你想要的.它具有重复计数,空值和无限字符串等规则,这对程序员来说通常是一个惊喜.我还经常看到程序员抱怨列表导向输入在预期时没有出错,因为编译器有一个扩展或程序员不明白该功能有多自由.
我建议您选择Fortran语言参考,并仔细阅读列表导向I/O部分.您可能会发现需要使用显式格式或更改程序的期望.