You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fortran新手求助:字符串转大写时丢失空格的问题排查

Fortran字符串转大写丢失空格问题解决

作为Fortran新手,我尝试通过遍历字符串、利用ASCII值将每个字符转为大写来生成新字符串。目前输出接近预期,但存在空格丢失的问题。我的代码如下:

Program CaesarCode
implicit none
character(len=2000), parameter::phrase="no spaces"

character(len=len_trim(phrase))::uppercase
integer::i
integer::j= len_trim(phrase)
character::c
do i=1, J
if(ichar(phrase(i:i))<123 .and. ichar(phrase(i:i)) >96) then
uppercase(i:i)= achar(ichar(phrase(i:i))-32)
else if(ichar(phrase(i:i))==95) then
uppercase(i:i)= ' '

end if

end do
print *, uppercase
end Program CaesarCode

当前示例输出为:

NOSPACES

问题原因

你的代码仅处理了小写字母(ASCII 97-122)和下划线(ASCII 95)的情况,而空格的ASCII值是32,不在判断逻辑范围内,导致uppercase对应位置的字符未被赋值,输出时空格丢失。

修复方案

最简洁的方式是先将uppercase整体初始化为原字符串的内容,再仅替换小写字母为大写,这样所有非小写字母的字符(比如空格、大写字母)都会直接保留:

Program CaesarCode
implicit none
character(len=2000), parameter::phrase="no spaces"

character(len=len_trim(phrase))::uppercase
integer::i
integer::j= len_trim(phrase)

! 初始化uppercase为原字符串的有效内容,保留所有原有字符
uppercase = phrase(1:j)

do i=1, j
    ! 仅将小写字母转为大写
    if(ichar(phrase(i:i)) > 96 .and. ichar(phrase(i:i)) < 123) then
        uppercase(i:i)= achar(ichar(phrase(i:i))-32)
    end if
end do

print *, uppercase
end Program CaesarCode

运行这段代码后,输出会是NO SPACES,空格被正确保留。

如果坚持逐个处理字符,也可以在原代码的判断逻辑中添加空格的处理分支:

else if(ichar(phrase(i:i)) == 32) then
    uppercase(i:i) = ' '

关于后续混合大小写处理

上述第一种修复方案已经天然支持混合大小写场景——原字符串中的大写字母不会进入小写判断逻辑,会直接保留在uppercase里。如果需求是将所有字母统一转为大写,该逻辑完全适用,无需额外修改。


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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 09:13:09