在linux下编程时linux 统计字段分隔符,有时侯我们须要获取shell命令的执行结果,一种比较笨的方式是将shell命令的执行结果保存到文件linux删除文件夹,之后在读文件,读完以后,再删掉文件,或则使用临时文件也行。这些技巧比较冗长,我推荐的一种方式是使用popen函数,FILE*popen(constchar*command,constchar*type),例如我要获取ls-l的结果,我们可以这样做
FILE*stream;
if((stream=popen("ls-l"),r)==NULL)
{
perror("popen");
exit(1);
}
charbuf[256];
while(fgets(buf,256,stream)!=NULL)
{
...
}
pclose(stream);
这样就获取了每一行的数据
在获取了那些数据然后,我们有时侯须要对那些数据进行解析,例如从那些字符数据中读出个别数据,这时侯strstr,strchr,strrchr,sscanf这种函数就很有用了。
(1)char*strstr(char*str,char*substr);
strstr函数返回str中第一次出现substr的表针.
例如有这样一个字符串str="TotalMem:1800FreeMem:800swapMem:500"
你想读出FreeMem的值linux 统计字段分隔符,你就可以这样做
char*p=strstr(str,"FreeMem:");
intfreeMem;
sscanf(p+strlen("FreeMem:"),"%d",&freeMem);
这儿用到了sscanf,下边再讲.
(2)char*strchr(char*s,charc);
strchr函数返回字符串s中首次出现字符c的表针,
char*s="WeareChinese!";
char*p;
p=strchr(s,'C')
(3)char*strrchr(char*str,charc);
strrchr函数返回字符串str从左侧算起首次出现字符c的表针,例如我们要从一个路径字符串中解析出文件的名子
char*path="/home/liming/123.txt"
char*fileName=strrchr(path,'/')+1;
(4)intsscanf(constchar*buffer,constchar*format[,argument]...);
sscanf可以从字符buffer中读进与指定格式相符的数据,这样在字符串解析式就十分有用
1.诸如:
char*str="Jan182006";
你要将年月日分割下来,就可以这样
intday;
intyear;
charmonth[4];
sscanf(str,"%s%d%d",month,&day,&year);
2.十分便捷,又例如
char*str="Jan0202:02:022000"
你要将数据分离下来
intyear;
charmonth[4];
intday;
inthour;
intmin;
intsec;
sscanf(str,"%s%2d%2d:%2d:%2d%d",month,&day,&hour,&min,&sec,&year);
3.sscanf不一定一空格为分隔符,例如一个字符串一顿号‘,’分割数据时
char*str="werwe,124,455,23234";
charbuf[10];
inta1,a2,a3;
sscanf(str,"%[^,],%d,%d,%d",buf,&a1,&a2,&a3);
[^,]表示碰到字符‘,’时结束
4.有时侯我们不一定要读所有的数据如何安装LINUX,可能会跳过一些数据,这时可以用%*
char*str="hi124iu233.334"
假如我们只需读第四和第五个数据时
doublea4;
inta5;
sscanf(str,"%*s%*d%*s%f%d",&a4,&a5);
%*表示略过