stupidity
stupidity

Reputation: 437

Fortran: Integer to String Example

I'm trying to write a simple Fortran code, for practicing. It is supposed to multiply numbers in a range. Each time, the resulting product is converted into a string because I want to see if it consists of the same digits.

I tested the way I transform an integer into a string and typed the components of the string, and everything was going correctly. Then, I need to compare the components of the string, for which I use string(number:number). But I couldn't get the code to do this correctly.

Here's the code and the output:

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

So I defined characters: a,b,c,d,e,f to contain the components of the string. And used myString(i:i) to locate each component and store it in one of the characters a,b,c,d,e,f. But it seems only the first two are working correctly, the rest is not being stored!

Output:

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

Notice 81. This was supposed to give 810000 the first time, and print "hobla". And give 810900 the second time and print "fobla". But this didn't happen!

Can anybody show me how to let myString accept the zeros as characters?

Upvotes: 2

Views: 17364

Answers (2)

tpg2114
tpg2114

Reputation: 15100

Okay, so I figured out the problem. Consider the following modifications to your code:

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

The resulting output is:

 k =      810000
 myString =     810000




 8
 1
 fobla
 k =      810900
 myString =     810900




 8
 1
 fobla

This happens because the I format right-justifies numbers when printed. So there is a bunch of leading white-spaces because your number is only 6 digits while your string you are writing into is 10. So you get 4 leading spaces.

If you change your format string so you have:

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

then instead of padding with spaces it will pad with 0's. That way you can always have digits to compare if you would rather.

Upvotes: 5

High Performance Mark
High Performance Mark

Reputation: 78316

This statement

write(myString,'(i10)') k

writes the value of k into a 10-character field. Since k has only 6 significant digits the first 4 characters in myString are filled with blanks. Then you assign the first 6 characters of myString (that is 4 blanks and the digits 8 and 1) to the variables a,b,c,d,e,f and print them out -- 4 blanks and 2 digits.

Try printing out the other characters in positions 7..10 of myString and you should see your 'missing' digits.

Upvotes: 5

Related Questions