user-0 提问: 怎么从调用的函数里面取出参数

回复:
user: user-1
content: zhao4zhong1@163.com

user: user-0
content: 顺便问一下两位老师的邮箱，有什么问题还请不吝赐教，感激不尽！！！

user: user-0
content: 多谢赵4老师和mymtom的帮助，小弟向两位致敬！

user: user-2
content: 可以用脚本简单实现的为啥要用程序呀 sed 's/\(.*:\)\(.*\)(\(\([^,()]*,*\)*[^,()]*\)).*/\1 \3/' a.txt | awk -F":" '{n=split($3,a,",");printf("%s %d",$1,n);for(i=1;i<=n;++i){printf(" %s", a[i])}printf("\n");}'

user: user-0
content: sed 's/\(.*:\)\(.*\)(\(\([^,()]*,*\)*[^,()]*\)).*/\1 \3/' a.txt 这一行shell可以使用C语言来实现吗？如果可以，需要使用到哪些函数呢？

user: user-0
content: 引用 9 楼 mymtom 的回复:$ sed 's/\(.*:\)\(.*\)(\(\([^,()]*,*\)*[^,()]*\)).*/\1 \3/' a.txt /home/cbs/src/file1.c:53: char *a,int b,FILE* fp /home/cbs/src/file2.c:128: a,b,fp /home/cbs/src/file3.c:234: a,b,fp 只能帮你到这里啦，剩下的自己努力吧！  谢谢

user: user-2
content: $ sed 's/\(.*:\)\(.*\)(\(\([^,()]*,*\)*[^,()]*\)).*/\1 \3/' a.txt /home/cbs/src/file1.c:53: char *a,int b,FILE* fp /home/cbs/src/file2.c:128: a,b,fp /home/cbs/src/file3.c:234: a,b,fp 只能帮你到这里啦，剩下的自己努力吧！

user: user-0
content: 怎么把第一行处理后变成第二行的格式呢 第一行 /home/cbs/src/file3.c:234:    if(tmp==store_func(a,b,fp)) 第二行 /home/cbs/src/file3.c  3  a  b  fp 需要用到什么函数？

user: user-1
content: 难者不会，会者不难： //怎么把第一行处理后变成第二行的格式呢 //第一行 /home/cbs/src/file3.c:234:    if(tmp==store_func(a,b,fp)) //第二行 /home/cbs/src/file3.c  3  a  b  fp #include <stdio.h> #include <string.h> char s[256]="/home/cbs/src/file3.c:234:    if(tmp==store_func(a,b,fp))"; char *p,*q,c; char d[256]; char pr[32]; int t,n,r; int main() {     p=strchr(s,':');     if (NULL==p) return 1;     sprintf(d,"%.*s",p-s,s);     while (1) {         q=p+1;         p=strchr(q,'(');         if (NULL==p) break;     }     p=q-1;     if (p[0]!='(') return 2;     t=0;     p++;     q=p;     while (1) {         r=sscanf(p,"%31[^,)]%n",pr,&n);         if (r==1) {             t++;             p+=n;             if (p[0]==')') break;             p++;         } else break;     }     sprintf(d,"%s  %d",d,t);     p=q;     while (1) {         r=sscanf(p,"%31[^,)]%n",pr,&n);         if (r==1) {             sprintf(d,"%s  %s",d,pr);             p+=n;             if (p[0]==')') break;             p++;         } else break;     }     printf("%s\n",d);// /home/cbs/src/file3.c  3  a  b  fp     return 0; }  作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。

user: user-1
content: 再供参考： //NAME: essaie bla bla //DIMENSION: 8 //DATA //1  14  15 //2  11  10 //3  6   4 //4  7   13 //5  9   21 //6  19  3 //7  1   5 //8  8   8 //EOF // // 文本文件中可能还含有其他内容，但是需要用到的内容即以上  //比如data.txt: //NAME: essaie bla bla //其它内容 //DIMENSION: 8 //其它内容 //DATA //其它内容 //1  14  15 //其它内容 //2  11  10 //其它内容 //3  6   4 //其它内容 //4  7   13 //其它内容 //5  9   21 //其它内容 //6  19  3 //其它内容 //7  1   5 //其它内容 //8  8   8 //其它内容 //EOF  // 目标是要获取NAME后字串，DIMENSION后数值，以及DATA以下的数值 // 其中NAME就是随便个字句，DIMENSION是城市数量，DATA以下是城市编号，X坐标，Y坐标 // 所有的这些将赋值给一个事先定义好的结构 #include <stdio.h> #include <string.h> #define MAXCPL   80   //每行最大字符数 #define MAXCITY  100  //每组数据中DATA最多项数，DIMENSION的最大值 #define MAXNAMEL 32   //NAME最大长度 struct S {     char NAME[MAXNAMEL+1];     int  DIMENSION;     struct D {         int NO;         int X;         int Y;     } DATA[MAXCITY]; } s; FILE *f; int st,n,i; char ln[MAXCPL]; int main() {     f=fopen("data.txt","r");     if (NULL==f) {         printf("Can not open file data.txt!\n");         return 1;     }     st=0;     n=0;     while (1) {         if (NULL==fgets(ln,MAXCPL,f)) break;         if (st==0) {             if (1==sscanf(ln,"NAME: %32[^\n]",s.NAME)) st=1;         } else if (st==1) {             if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;         } else if (st==2) {             if (0==strcmp(ln,"DATA\n")) st=3;         } else if (st==3) {             if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {                 n++;                 if (n>=MAXCITY || n>=s.DIMENSION) break;             }         }     }     fclose(f);     printf("s.NAME=[%s]\n",s.NAME);     printf("s.DIMENSION=%d\n",s.DIMENSION);     for (i=0;i<n;i++) {         printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);     }     return 0; } //s.NAME=[essaie bla bla] //s.DIMENSION=8 //s.DATA[0].NO,X,Y=1,14,15 //s.DATA[1].NO,X,Y=2,11,10 //s.DATA[2].NO,X,Y=3,6,4 //s.DATA[3].NO,X,Y=4,7,13 //s.DATA[4].NO,X,Y=5,9,21 //s.DATA[5].NO,X,Y=6,19,3 //s.DATA[6].NO,X,Y=7,1,5 //s.DATA[7].NO,X,Y=8,8,8

user: user-1
content: 仅供参考： #include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:2楼代码就是处理的例子。 具体怎么处理？看了一下午还没有明白......

user: user-1
content: 2楼代码就是处理的例子。

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:再供参考： //NAME: essaie bla bla //DIMENSION: 8 //DATA //1  14  15 //2  11  10 //3  6   4 //4  7   13 //5  9   21 //6  19  3 //7  1   5 //8  8   8 //EOF // // 文本文件中可能还含有其他内容，但是需要用到的内容即以上  //比如data.txt: //NAME: essaie bla bla //其它内容 //DIMENSION: 8 //其它内容 //DATA //其它内容 //1  14  15 //其它内容 //2  11  10 //其它内容 //3  6   4 //其它内容 //4  7   13 //其它内容 //5  9   21 //其它内容 //6  19  3 //其它内容 //7  1   5 //其它内容 //8  8   8 //其它内容 //EOF  // 目标是要获取NAME后字串，DIMENSION后数值，以及DATA以下的数值 // 其中NAME就是随便个字句，DIMENSION是城市数量，DATA以下是城市编号，X坐标，Y坐标 // 所有的这些将赋值给一个事先定义好的结构 #include <stdio.h> #include <string.h> #define MAXCPL   80   //每行最大字符数 #define MAXCITY  100  //每组数据中DATA最多项数，DIMENSION的最大值 #define MAXNAMEL 32   //NAME最大长度 struct S {     char NAME[MAXNAMEL+1];     int  DIMENSION;     struct D {         int NO;         int X;         int Y;     } DATA[MAXCITY]; } s; FILE *f; int st,n,i; char ln[MAXCPL]; int main() {     f=fopen("data.txt","r");     if (NULL==f) {         printf("Can not open file data.txt!\n");         return 1;     }     st=0;     n=0;     while (1) {         if (NULL==fgets(ln,MAXCPL,f)) break;         if (st==0) {             if (1==sscanf(ln,"NAME: %32[^\n]",s.NAME)) st=1;         } else if (st==1) {             if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;         } else if (st==2) {             if (0==strcmp(ln,"DATA\n")) st=3;         } else if (st==3) {             if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {                 n++;                 if (n>=MAXCITY || n>=s.DIMENSION) break;             }         }     }     fclose(f);     printf("s.NAME=[%s]\n",s.NAME);     printf("s.DIMENSION=%d\n",s.DIMENSION);     for (i=0;i<n;i++) {         printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);     }     return 0; } //s.NAME=[essaie bla bla] //s.DIMENSION=8 //s.DATA[0].NO,X,Y=1,14,15 //s.DATA[1].NO,X,Y=2,11,10 //s.DATA[2].NO,X,Y=3,6,4 //s.DATA[3].NO,X,Y=4,7,13 //s.DATA[4].NO,X,Y=5,9,21 //s.DATA[5].NO,X,Y=6,19,3 //s.DATA[6].NO,X,Y=7,1,5 //s.DATA[7].NO,X,Y=8,8,8    我是指处理文本问题，你这个程序是文本已经处理好了，直接读入结构体吧？ 我也是要把数据存入结构体，但是前提是要把文本内容处理好。 如题，如何处理好文本内容？

user: user-0
content: 引用 1 楼 user-3 的回复:找括号 逗号划分 能说说具体需要用到C语言中的哪些函数来处理吗？

user: user-3
content: 找括号 逗号划分