怎么用高效的代码提取格式化字符串中的信息

如何用高效的代码提取格式化字符串中的信息
本贴是隔壁帖子的继续,原帖问题解决,但引起我另外的思考,所以新开一贴。

有如下的文本若干行
------------------示例文本开始,不包含本行------------------
f(a  bc,甲)=丙
f(a,乙)=戊/222    //123
f(48,丙)=戊
f(2aaaaaaa   ,丙)=戊//aaa
f(48,张三)=戊
f(阿3,丁)=乙    //子丑寅卯
f(48,)=李四  //子鼠丑牛
------------------示例文本结束,不包含本行------------------
每一行的格式如下:
f(*1,*2)=*3   //*4
其中//*4可能不存在
我想正确提取*1、*2、*3、*4的内容,放入4个字符缓冲区s1、s2、s3、s4中。

现在参考帖子
http://bbs.****.net/topics/390908304
中的代码,修改成如下的程序:

#include <stdio.h>
FILE *f;
char ln[80];
char s1[40];
char s2[40];
char s3[40];
char s4[40];
int i;
int main()
{
f=fopen("in.txt","r");
if (NULL==f)
{
printf("Can not open file in.txt!\n");
return 1;
}
i=0;
while (fgets(ln,80,f))
{
if (3<=sscanf(ln,"f(%39[^,],%39[^)])=%39[^/\n]//%[^\n]",s1,s2,s3,s4))
{
printf("[%s],[%s],[%s],[%s]\n",s1,s2,s3,s4);
}
else
{
printf("in.txt line %d format error:%s",i+1,ln);
}
i++;
}
fclose(f);
return 0;



上面的程序运行后,得到如下的结果:
------------------运行结果开始,不包含本行------------------
[[a  bc],[甲],[丙],[]
[a],[乙],[戊],[]
[48],[丙],[戊],[]
[2aaaaaaa   ],[丙],[戊],[aaa]
[48],[张三],[戊],[aaa]
[阿3],[丁],[乙    ],[子丑寅卯]
in.txt line 7 format error:f(48,)=李四  //子鼠丑牛
------------------运行结果结束,不包含本行------------------

我发现第二行数据提取出来的s3和s4不对:
s3应该是“戊/222    ”
s4应该是“123”
其他各行的数据提取结果都没问题。

请问如何修改程序能让第二行数据也正确提取?
------解决思路----------------------
这个已经超越scanf的阉割正则语法的能力了。请自行处理或使用正规正则库。
------解决思路----------------------
http://www.cnblogs.com/hjslovewcl/articles/2314311.html
http://blog.sina.com.cn/s/blog_5357c0af0100hfua.html
------解决思路----------------------
//in.txt
//f(a  bc,甲)=丙
//f(a,乙)=戊/222    //123
//f(48,丙)=戊
//f(2aaaaaaa   ,丙)=戊//aaa
//f(48,张三)=戊
//f(阿3,丁)=乙    //子丑寅卯
//f(48,)=李四  //子鼠丑牛
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
FILE *f;
char ln[80];
char s1[40];
char s2[40];
char s34[80];
char *p;
char s3[40];
char s4[40];
int i,k;
int main() {
    f=fopen("in.txt","r");
    if (NULL==f) {
        printf("Can not open file in.txt!\n");
        return 1;
    }
    i=0;
    while (fgets(ln,80,f)) {
        if (3==sscanf(ln,"f(%39[^,],%39[^)])=%79[^\n]",s1,s2,s34)) {
            p=strstr(s34,"//");
            if (p) {
                k=__min(39,p-s34);
                strncpy(s3,s34,k);s3[k]=0;
                k=__min(39,strlen(p+2));
                strncpy(s4,p+2,k);s4[k]=0;
            } else {
                strncpy(s3,s34,39);s3[39]=0;
                s4[0]=0;
            }
            printf("[%s],[%s],[%s],[%s]\n",s1,s2,s3,s4);
        } else {
            printf("in.txt line %d format error:%s",i+1,ln);
        }
        i++;
    }
    fclose(f);
    return 0;
}
//[a  bc],[甲],[丙],[]
//[a],[乙],[戊/222    ],[123]
//[48],[丙],[戊],[]
//[2aaaaaaa   ],[丙],[戊],[aaa]
//[48],[张三],[戊],[]
//[阿3],[丁],[乙    ],[子丑寅卯]
//in.txt line 7 format error:f(48,)=李四  //子鼠丑牛
//