在Fortran中,如何知道带有尾随空格的用户输入的长度?

在Fortran中,如何知道带有尾随空格的用户输入的长度?,fortran,string-length,Fortran,String Length,我想知道Fortran中用户输入的一行的长度。由于该输入可能包含一些尾随空格,因此LEN_TRIM不会给出正确答案 program test implicit none character(len=100) :: s read(*, '(a)') s write(*, '(i0)') len_trim(s) end program test 输入和输出示例: 输入:你好,世界 产出:12 预期产出:15 输入:5个空格 输出:0 预期输出:5因此,如果我理解您的问题,您希望在查询中包含用

我想知道Fortran中用户输入的一行的长度。由于该输入可能包含一些尾随空格,因此LEN_TRIM不会给出正确答案

program test

implicit none
character(len=100) :: s

read(*, '(a)') s
write(*, '(i0)') len_trim(s)

end program test
输入和输出示例:

输入:你好,世界

产出:12

预期产出:15

输入:5个空格

输出:0


预期输出:5

因此,如果我理解您的问题,您希望在查询中包含用户在其输入中包含的任何尾随空格

这在Fortran格式的I/O中根本不可能从键盘的标准输入中实现——我错了,请看@evets的答案——我现在认为,对于推进完整行的输出来说,这是唯一正确的。无法区分用户包含的尾随空格和通常用于填充所有Fortran字符串的空格


因此,当len_trim计算字符串长度时,它会删除所有尾随空格,包括用户输入的空格。微调功能也是如此。

一次读取输入的一个字符,并计算从标准输入中读取的数字

TRIM和LEN_TRIM仍将去除尾随空格。 您可以测试si:i=='',然后将其设置为
可打印字符。

有几种方法:

program test_getline
    use, intrinsic :: iso_fortran_env
    implicit none

    integer, parameter :: latin1 = selected_char_kind('ISO_10646')
    character(*), parameter :: fn = 'test_getline.tmp'

    character(30, kind=latin1) s
    integer i, ioss, sz, l

    open(unit=output_unit, encoding='utf-8')

    open(unit=10, file=fn, encoding='utf-8')
    write(10, '(a)') 'Für eigenständig Roß     '

    rewind(10)
        ! Read line character by character.
    l = len(s)
    do i = 1, len(s)
        read(10, '(a)', iostat=ioss, advance='no') s(i:i)
        if(ioss < 0) then
            l = i - 1
            exit
        end if
    end do
    print *, l, '"', s(:l), '"'

    rewind(10)
        ! Read line without padding, length null terminating string.
    s = repeat(char(0, latin1), len(s))
    read(10, '(a)', iostat=ioss, pad='no') s
    l = index(s, char(0, latin1)) - 1
    print *, l, '"', s(:l), '"'

    rewind(10)
        ! Count input character from file. 
        ! For UTF-8 encoding, it can be longer than the string length.
    read(10, '(a)', advance='no', iostat=ioss, size=sz) s
    print *, sz, '"', s(:sz), '"'

end program test_getline

欢迎光临,请出示您的密码。看见显示你得到的答案并解释你想要的答案。对不起,我忘记附上我的测试代码。请同时显示输入和结果。我添加了。谢谢你的建议。我想不出一种从标准输入中格式化I/O的方法。但我可能错了。没有格式化的I/O,有什么好方法解决这个问题吗?如果你可以从文本文件中读取,你可以分别读取每个字节。还有一些方法可以像读取二进制文件一样读取输入流,但是它们是特定于系统的。您也可以尝试类似的方法,从C访问完整的字符串。真的很有趣。我没有想到这一点。但是当用户使用backspace时,它会做一些有趣的事情,你会得到像i-1=86这样的字符串�▒P�����������▒�����@8.���▒����▒F��▒▒` 在格弗特兰。在英特尔Fortran中看起来更好。是的,奇怪的事情可能会发生,因为stdin是一个预连接单元,操作系统可能会以某种方式管理它。我懒得写代码,把“c”作为临时变量,选择CASEc来抛出backspace之类的东西。嗯,刚刚在类似UNIX的系统上使用gfortran进行了测试,我没有看到您显示的退格问题。好的,如果在读取之前正确初始化字符串,它就会消失。它不能正确用于退格等,但只处理空格就足够了。根据你的想法,我发现read*,'100a',eor=10,advance='no',size=cnt也可以使用,其中cnt是一个整数变量。谢谢!这可能是最好的了。@francescalus,好的,更改示例和输出。所有三个字符串读数与空格的数量和位置无关。
program test_getline
    use, intrinsic :: iso_fortran_env
    implicit none

    integer, parameter :: latin1 = selected_char_kind('ISO_10646')
    character(*), parameter :: fn = 'test_getline.tmp'

    character(30, kind=latin1) s
    integer i, ioss, sz, l

    open(unit=output_unit, encoding='utf-8')

    open(unit=10, file=fn, encoding='utf-8')
    write(10, '(a)') 'Für eigenständig Roß     '

    rewind(10)
        ! Read line character by character.
    l = len(s)
    do i = 1, len(s)
        read(10, '(a)', iostat=ioss, advance='no') s(i:i)
        if(ioss < 0) then
            l = i - 1
            exit
        end if
    end do
    print *, l, '"', s(:l), '"'

    rewind(10)
        ! Read line without padding, length null terminating string.
    s = repeat(char(0, latin1), len(s))
    read(10, '(a)', iostat=ioss, pad='no') s
    l = index(s, char(0, latin1)) - 1
    print *, l, '"', s(:l), '"'

    rewind(10)
        ! Count input character from file. 
        ! For UTF-8 encoding, it can be longer than the string length.
    read(10, '(a)', advance='no', iostat=ioss, size=sz) s
    print *, sz, '"', s(:sz), '"'

end program test_getline
      25 "Für eigenständig Roß     "
      25 "Für eigenständig Roß     "
      28 "Für eigenständig Roß        "