一. Fortran 字符串与 C 字符串的区别
  Fortran的字符串处理能力其实很弱,关于字符串的语法还很落后。它与 C 字符串最大的区别就是:Fortran字符串是固定长度的,没有 \0 结束符。另外,Fortran 也不区分字符和字符串。即 'abc' 与 "abc" 是没有差别的。

二. Fortran 字符串的定义。
  Fortran字符串是固定长度的。因此,在声明时,就必须指定长度。(如不指定,大多数编译器认为是长度为 1 的字符串)
  声明时,可以按照这些格式进行:

 integer , parameter :: L =
character :: s1* = "fcode.cn"
character* :: s2 = "fcode.cn"
character() :: s3 = "fcode.cn"
character( len = ) :: s4 = "fcode.cn"
character( len = L ) :: s5 = "fcode.cn"

目前,笔者不建议使用第2行和第3行的方式。第4行的方式还算凑合。建议最好是使用第5行的方式,第6行演示了长度可以使用 parameter 常数,这样适合于需要大量定义相同长度的字符串。

三. Fortran字符串的长度问题
    需要注意的是,字符串的长度一旦确定了,就无法改变。这一点笔者也感到语法应该改进,很不方便。

例如上例。character( Len = 20 ) :: s4 = "fcode.cn" 尽管后面的值 "fcode.cn" 只有 8 个字符,但是定义了变量是 20 长度,所以,实际 s4 的内容为 "fcode.cn            "(后面有12个空格)

如果我们要输出或使用字符串,往往需要去掉后面的空格,此时可使用 trim 函数。

write(*,*) trim(s4)

这样,就只会输出有内容的 8 个字符,后面的 12 个空格就不会输出。

特别需要注意的是,s4 = trim(s4) 这样的句子是没有任何意义的。因为虽然这个式子的右侧,trim(s4) 的结果是 8 个字符,但赋值给式子左侧的字符串,它依然是 20 长度。它等效于 s4 = "fcode.cn",所以 s4 的内容依然是 “fcode.cn            ”(读者可回去看上面的绿色文字)

这让我们很犯难。因此,trim 语句必须出现在每一次使用这个字符串的时候。

四. Fortran 字符串的连接(append)
  我们经常会挂靠字符串,比如 "fcode.cn" 在后面挂靠一个 "/bbs",很多初学者就会使用这样的代码:
  character( Len = 20 ) :: s4 = "fcode.cn"
  s4 = s4 // "/bbs"
  输出以后,发现 s4 的内容依然没有改变。并没有变成期望中的 "fcode.cn/bbs"。究其原因,其实就是第三个问题导致的。我们来观察上面的等式:s4 = s4 // "/bbs",等号左边 s4 有 20 长度,等号右边 s4 的 20 长度加上 "/bbs" 的 4 长度,一共 24 个长度。左边20个长度根本容纳不下右边的24个长度,于是,s4 依然是 s4,后面挂靠的 "/bbs" 由于存储不下而被丢弃。

正确的挂靠方式是: s4 = trim(s4) // "/bbs"

而反之,s4 = "http://" // s4 就不需要写 trim,请读者朋友自己思考为什么?

五. 字符串的左右对齐(AdjustL,AdjustR)
  我们经常会遇到这样的问题,除了后面的空格外,有时候字符串前面也有空格。例如 s4 = "    FortranCoder  ",单一的 trim 结果会是 "     FortranCoder"。
  此时我们就需要 AdjustL 函数,我们可以这样写: trim(AdjustL(s4)) , 或者 AdjustL(trim(s4)) 这两者的顺序无所谓,结果都是一样的。
  AdjustR 函数使用的情况非常少,通常不用。它可以把 "  abc  " 变为 "    abc"

六. 字符串与整型,实型的相互转换
  Fortran 的字符串与整型实现转换,是个很有意思的事情。它不像其他语言那样,提供一个函数来进行。而使用 read 和 write 读写来实现。
  看下面的例子:

 Program www_fcode_cn
Implicit None
Real :: r
Integer :: i
Character( Len = ) :: c
c = "3.1415926"
read( c , * ) r !// 将 字符串c 转换为实数 r
write( * , * ) r + 1.0
i = int( r - 2.0 ) !// 给 i 一个值
write( c , '(i0)' ) i !// 把整型i 转换为字符串 c
c = AdjustL(trim(c)) // "st"
write( * , * ) Trim( c )
End Program www_fcode_cn

这里的第 7 行,看起来是一个 read 语句,它其实是转换。意思是:从字符串 c 中读取 r 的值。读者可以把此时的字符串 c 想成是一个虚拟的文件。
这里的第 10 行,看起来是一个 write 语句,其实它还是转换。意思是:把 i 的值,写入字符串 c 中,读者依然可以想象成 c 是一个虚拟的文件。
简单的说,就是 read 和 write 语句,可以直接对字符串进行操作。字符串可以被认为是虚拟的文件,从字符串中获得数值,就是read;把值写入到字符串中,就是write。

七. 一个实例
  这里,我们列举一个实际字符串使用的例子。
  假设现在有一个文件,其内容如下:
// This is a sample file
// There may be some comment text
Time:13:23:42 RecordID:18 Weather:Sunny
Fcode.cn Date:2014-02-38
前两行是注释,而且有可能不是两行,不确定有多少行。
然后是一些数据组合在一起。我们需要找到 RecordID: 后面的数字,即,18。我们事先不能确定 RecordID 在第几行的什么位置里。
找到之后,我们需要给它加上 2014,即,2014+18=2032。
最后我们打开 File2031.dat 文件,开始读取其中的数据。

上面的一系列操作,如果不使用字符串,恐怕会很难。下面我们来看看如何书写代码来完成。利用本文所提到的各种内容。

代码中有一部分注释,相信读者朋友能够理解

 Program www_fcode_cn
Implicit None
Integer , parameter :: MAX_PATH =
Character( Len = MAX_PATH ) :: c
Character( Len = * ) , parameter :: STR_FIND = "RecordID:"
integer :: ID , i , iErr
Open( , File = "fcode.txt" )
Do
Read( , '(a512)' , ioStat = iErr ) c !必须a512格式,否则遇到空格会终止
if ( iErr /= ) Exit !// 如果读错了,比如遇到文件结束,则退出循环
if ( c(:) == "//" ) cycle !// 如果读取的是注释行,则直接读下一行
i = index( c , STR_FIND ) !// 在 c 中搜索 RecordID: 的位置
if ( i > ) then !// 如果找到
i = i + Len(STR_FIND) !// 将位置移到RecordID:后面
c = c(i:) !// 使得 c 的内容为 i 位置之后的内容,即放弃i位置之前的内容
read( c , * ) ID !// 读取 ID 编号
write( c , * ) ID + !// ID 编号加上2014,再写回c中
c = "File" // Trim(AdjustL(c)) // ".dat" !组合成File2032.dat,注意trim
write( * , * ) Trim( c ) !// 输出看看对不对
!// Open( 13 , File = Trim( c ) )
Exit
end if
End Do
Close( )
End Program www_fcode_cn

转自:http://fcode.cn/guide-48-1.html

[转载]:Fortran字符串的故事的更多相关文章

  1. (转载)浏览器 user-agent 字符串的故事

    本文转载自:http://www.cnblogs.com/ifantastic/p/3481231.html. 如有侵权,请联系处理!   你是否好奇标识浏览器身份的User-Agent,为什么每个浏 ...

  2. 浏览器 user-agent 字符串的故事

    你是否好奇标识浏览器身份的User-Agent,为什么每个浏览器都有Mozilla字样? 故事还得从头说起,最初的主角叫NCSA Mosaic,简称Mosaic(马赛克),是1992年末位于伊利诺伊大 ...

  3. [转载]SQL字符串处理函数大全

    [转载]http://www.cnblogs.com/andy2005/archive/2007/12/04/981864.html select语句中只能使用sql函数对字段进行操作(链接sql s ...

  4. 转载:字符串hash总结(hash是一门优雅的暴力!)

    转载自:远航休息栈 字符串Hash总结 Hash是什么意思呢?某度翻译告诉我们: hash 英[hæʃ] 美[hæʃ]n. 剁碎的食物; #号; 蔬菜肉丁;vt. 把…弄乱; 切碎; 反复推敲; 搞糟 ...

  5. 【转载】字符串最小表示法-O(n)算法

    原博客链接:http://blog.csdn.net/zy691357966/article/details/39854359 未授权,侵权删. 因为这篇博客写得真好..转载了.. 红色的字是原博主写 ...

  6. 转载:字符串HASH

    转载自:Slager_Z 字符串Hash总结 Hash是什么意思呢?某度翻译告诉我们: hash 英[hæʃ] 美[hæʃ]n. 剁碎的食物; #号; 蔬菜肉丁;vt. 把…弄乱; 切碎; 反复推敲; ...

  7. [转载]:fortran之format格式化输出总结

    先贴一段别人总结好的: 格式化输出的控制字符非常的丰富,但常用的并不多,一般说来:" I .F.E.A.X "是最常使用的几个格式,最 好把它们都记下来. Iw[.m] 以w个字符 ...

  8. [转载]PHP 字符串替换中文

    $a = "Car 神"; $result = preg_replace('/([\x80-\xff]*)/i','',$a); var_dump($result); 参考链接:p ...

  9. [转载]C#字符串加密和解密

    using System.Security.Cryptography; using System.IO; //默认密钥向量 private static byte[] Keys = { 0x12, 0 ...

随机推荐

  1. Java xml object 互转

    public class ClassRoom { private int id; private String name; private int grade; public int getId() ...

  2. 《Java中方法的重写》

    //方法的重写 /* 注意:方法的重写要遵循“两同两小一大”规则 “两同”即方法名相同.形参列表相同: “两小”(1)指的是子类方法返回值类型比父类方法的返回值类型更小或相等,[什么意思?] (2)子 ...

  3. Spring框架学习(二)

    一.依赖注入的三种注入方式 Spring框架为我们提供了三种注入方式:set注入.构造方法注入和接口注入. 1.set注入 规律:无论给什么赋值,配置文件中<property>标签的nam ...

  4. 黑马程序员:Java编程_基础语法

    =========== ASP.Net+Android+IOS开发..Net培训.期待与您交流!=========== 一.数据类型 基本数据类型(简单数据类型.语言所内置的类型) 引用数据类型:(自 ...

  5. Java数据结构和算法之链表

    三.链表 链结点 在链表中,每个数据项都被包含在‘点“中,一个点是某个类的对象,这个类可认叫做LINK.因为一个链表中有许多类似的链结点,所以有必要用一个不同于链表的类来表达链结点.每个LINK对象中 ...

  6. MySQL mac 安装

    MySQL mac的安装着实费了些功夫.最开始想省事用brew 安装,结果总是有问题,原来brew安装MySQL并没那么简单,还要进行一些配置.索性直接到网站下载: http://www.mysql. ...

  7. Python 利用pytesser模块识别图像文字

    使用的是python的pytesser模块,原先想做的是图片中文识别,搞了一段时间了,在中文的识别上还是有很多问题,这里做记录分享. pytesser,OCR in Python using the ...

  8. Jrebel6.3.3破解,配置图文教程

    JRebel是个很好的开发工具,我在网上找了好久都没有找到很详细的教程,破解与配置教程千篇一律,步骤不详细.编写这篇教程,综合网络上的知识,加上了自己的理解与详细图文步骤. 安装 一般最新的插件是没有 ...

  9. java中的static关键词

    以下来自:http://www.cnblogs.com/codc-5117/archive/2011/12/04/2275298.html Static基本规则:             (1)一个类 ...

  10. LVS的调度算法

    LVS的调度算法(Scheduling Method)一共有10种 一.静态方法:仅根据算法本身进行调度 1.rr(Round Robin):轮询 2.wrr(Werghted Round Robin ...