2

我正在尝试编写一个简单的 Fortran 代码,用于练习。它应该将某个范围内的数字相乘。每次,结果产品都被转换成一个字符串,因为我想看看它是否由相同的数字组成。

我测试了将整数转换为字符串并键入字符串的组件的方式,一切正常。然后,我需要比较字符串的组成部分,为此我使用 string(number:number)。但我无法让代码正确执行此操作。

这是代码和输出:

program test
implicit none
character(10) myString
character(1) a,b,c,d,e,f
integer::i,j,k
do i=900,901,1
        j=900
        k=i*j
        write(*,*)'k =', k
        write(myString,'(i10)') k
        write(*,*)'myString = ', myString
        a=myString(1:1)
        b=myString(2:2)
        c=myString(3:3)
        d=myString(4:4)
        e=myString(5:5)
        f=myString(6:6)
        print*,a,b,c,d,e,f
        if (d==f) then
            print*,'hobla'
        else
            print*,'fobla'
        end if
end do

stop
end program test

所以我定义了字符:a,b,c,d,e,f 来包含字符串的组成部分。并使用 myString(i:i) 定位每个组件并将其存储在字符 a、b、c、d、e、f 之一中。但似乎只有前两个工作正常,其余的没有被存储!

输出:

 k =      810000
 myString =     810000
     81
 fobla
 k =      810900
 myString =     810900
     81
 fobla

注意 81。这应该是第一次给出 810000,并打印“hobla”。并第二次给810900并打印“fobla”。但这并没有发生!

谁能告诉我如何让 myString 接受零作为字符?

4

2 回答 2

5

这个说法

write(myString,'(i10)') k

将 k 的值写入 10 个字符的字段。由于 k 只有 6 个有效数字,因此其中的前 4 个字符myString用空格填充。然后将前 6 个字符myString(即 4 个空格和数字 8 和 1)分配给变量a,b,c,d,e,f并打印出来——4 个空格和 2 个数字。

尝试打印出位置的其他字符,7..10myString应该会看到“丢失”的数字。

于 2012-11-09T22:10:30.487 回答
4

好的,所以我发现了问题所在。考虑对您的代码进行以下修改:

program test
implicit none
character(10) myString
character(1) a,b,c,d,e,f
integer::i,j,k
do i=900,901,1
   j=900
   k=i*j
   write(*,*)'k =', k
   write(myString,'(i10)') k
   write(*,*)'myString = ', myString
   a=myString(1:1)
   b=myString(2:2)
   c=myString(3:3)
   d=myString(4:4)
   e=myString(5:5)
   f=myString(6:6)
   write(*,*) a
   write(*,*) b
   write(*,*) c
   write(*,*) d
   write(*,*) e
   write(*,*) f
   if (d==f) then
       print*,'hobla'
   else
       print*,'fobla'
   end if
end do

stop
end program test

结果输出是:

 k =      810000
 myString =     810000




 8
 1
 fobla
 k =      810900
 myString =     810900




 8
 1
 fobla

发生这种情况是因为I格式在打印时右对齐数字。所以有一堆前导空格,因为你的数字只有 6 位,而你正在写入的字符串是 10。所以你得到 4 个前导空格。

如果您更改格式字符串,您将拥有:

write(myString,'(i10.10)') k

然后不是用空格填充,而是用 0 填充。这样,如果您愿意,您总是可以有数字进行比较。

于 2012-11-09T22:11:42.433 回答