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
相关产品推荐
相关产品推荐

