You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Fortran中从控制台输入未知长度字符串并解决段错误问题

Fixing the Segmentation Fault When Reading Variable-Length Strings in Fortran

Let's break down why your code is crashing and how to fix it properly.

Why the Segmentation Fault Happens

Your allocatable character variable a is declared but not yet allocated when you try to read into it with read(*,*) a. Fortran has no way to know how much memory to set aside for your input string, so it tries to access unassigned memory—hence the SIGSEGV error.

Also, the default list-directed input (read(*,*)) treats spaces as separators, which isn't ideal if you want to read names with spaces (like "Mary Ann").

Solution 1: Use a Temporary Fixed-Length String (Most Compatible)

This method works with all Fortran compilers and handles spaces in names:

program name
    implicit none
    character(len=256) :: temp  ! A buffer big enough for most inputs
    character(:), allocatable :: a
    
    print *, "Enter a name: "
    read(*, '(a)') temp  ! Read the entire line into the buffer
    a = trim(adjustl(temp))  ! Remove leading/trailing spaces and allocate a
    
    print *, "Hello, ", a, "!"
end program name

How it works:

  • We first read the entire input line into temp, a fixed-length string (256 characters is more than enough for most names).
  • trim(temp) removes trailing spaces, adjustl(temp) shifts the string left to eliminate leading spaces. Assigning this result to a automatically allocates the right amount of memory for the actual input.

Solution 2: Directly Read to Allocatable String (Modern Fortran)

If you're using a compiler that supports Fortran 2003 or later (like recent versions of gfortran, Intel Fortran), you can read directly into an unallocated allocatable string by using the (a) format specifier:

program name
    implicit none
    character(:), allocatable :: a
    
    print *, "Enter a name: "
    read(*, '(a)') a  ! Compiler auto-allocates a to match input length
    
    print *, "Hello, ", trim(a), "!"
end program name

Note:

  • This is cleaner, but make sure your compiler has Fortran 2003+ support enabled (most modern ones do by default).
  • Using (a) ensures we read the entire line, including spaces, unlike the default list-directed input.

Avoiding Common Pitfalls

  • Never use list-directed input (read(*,*)) with an unallocated allocatable character variable—it will always cause memory issues.
  • If you need to handle very long inputs, increase the length of the temporary buffer in Solution 1 (e.g., len=1024).

内容的提问来源于stack exchange,提问作者Ruthvik

火山引擎 最新活动