Fortran Coder

查看: 894|回复: 0
打印 上一主题 下一主题

字符串提取数据的4种方法

[复制链接]

152

帖子

44

主题

1

精华

宗师

F 币
1349 元
贡献
640 点
跳转到指定楼层
楼主
发表于 2024-6-16 13:28:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 weixing1531 于 2024-6-16 13:36 编辑

例如从字符串"SetColor(255,30,58)"提取255,30,58这三个整数

方法1、方法2为Fortran方法,利用read,index
方法3、方法4为C语言方法,利用函数sscanf,strtok

[Fortran] 纯文本查看 复制代码
01program main
02    use iso_c_binding
03    implicit none
04 
05    interface
06        !void c_sscanf(const char *str,const char *ft,int *r,int *g,int *b)
07        subroutine c_sscanf(str,ft,r,g,b) bind(c) !封装c语言sscanf子程序
08            import::c_char,c_int
09            character(c_char),intent(in)::str(*),ft(*)
10            integer(c_int)::r,g,b
11        end subroutine
12        !void c_strtok(char *str,char *ft,int *num,char out[],int *len)
13        subroutine c_strtok(str,ft,num,out,len) bind(c) !封装c语言strtok子程序
14            import::c_char,c_int
15            character(c_char),intent(in)::str(*),ft(*)
16            integer(c_int)::num !子字符串个数
17            character(kind=c_char)::out(*) !子字符串拼接
18            integer(c_int)::len !字符串长度
19        end subroutine
20    end interface
21     
22    integer::left,right !边界位置
23    integer(c_int)::r,g,b,lenth,num
24    character(100)::temp_str !用于占位
25    character(100)::out
26    character(:),allocatable::str,sep !被解析字符串 间隔符
27    !方法1
28    str="SetColor(255,30,58)" !被解析字符串
29    sep=str(13:13) !间隔符
30    write(*,"('被解析字符串:',a)")str
31    write(*,"('间隔符:[',a,']')")sep
32    read(str,"(a9,i3,a1,i2,a1,i2)")temp_str,r,temp_str,g,temp_str,b
33    write(*,"('方法1:',*(i0,1x))")r,g,b !缺点:i格式宽度必须固定
34    r=0;g=0;b=0 !置0
35     
36    if(sep=="," .or. sep==" ")then !间隔符限制(" "或",")
37        !方法2
38        left=index(str,"(") !左边界位置
39        right=index(str,")") !右边界位置
40        read(str(left+1:right-1),*)r,g,b
41        write(*,"('方法2:',*(i0,1x))")r,g,b !缺点:间隔符限制(" "或",")
42        r=0;g=0;b=0 !置0
43    end if
44    !方法3
45    call c_sscanf(str//c_null_char,"SetColor(%d"//sep//"%d"//sep//"%d)"//c_null_char,r,g,b)
46    write(*,"('方法3:',*(i0,1x))")r,g,b !缺点:Fortran不支持可变形参,参数个数变化需修改c源代码和Fortran接口
47    r=0;g=0;b=0 !置0
48    !方法4
49    call c_strtok(str//c_null_char,"("//sep//")"//c_null_char,num,out,lenth) !方法1
50    write(*,"('元素个数:',i0,/'字符串长度:',i0)")num,lenth
51    write(*,"('字符串:',a)")out(1:lenth)
52    read(out(1:lenth),*)temp_str,r,g,b
53    write(*,"('方法4:',*(i0,1x))")r,g,b !较复杂
54    deallocate(str,sep)
55    read(*,*)
56end program

fortran.zip (319.08 KB, 下载次数: 0)



分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2025-4-6 14:43

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

快速回复 返回顶部 返回列表