在linux下編程時(shí),有時(shí)候我們需要獲取shell命令的執(zhí)行結(jié)果,一種比較笨的方法是將shell命令的執(zhí)行結(jié)果保存到文件,然后在讀文件,讀完之后,再刪除文件,或者使用臨時(shí)文件也行。這種方法比較繁瑣,我推薦的一種方法是使用popen函數(shù),F(xiàn)ILE *popen(const char *command, const char *type),比如我要獲取ls -l的結(jié)果,我們可以這樣做
這樣就獲取了每一行的數(shù)據(jù)
在獲取了這些數(shù)據(jù)之后,我們有時(shí)候需要對(duì)這些數(shù)據(jù)進(jìn)行解析,比如從這些字符數(shù)據(jù)中讀出某些數(shù)據(jù),這時(shí)候 strstr,strchr,strrchr,sscanf這些函數(shù)就很有用了。
(1) char* strstr(char* str, char* substr);
strstr函數(shù)返回str中第一次出現(xiàn)substr的指針.
比如有這樣一個(gè)字符串 str = "TotalMem:1800 FreeMem:800 swapMem:500"
你想讀出FreeMem的值,你就可以這樣做
char *p = strstr(str, "FreeMem:");
int freeMem;
sscanf(p+ strlen("FreeMem:"), "%d", &freeMem);
這里用到了sscanf,下面再講.
(2) char *strchr(char *s,char c);
strchr函數(shù)返回字符串s中首次出現(xiàn)字符c的指針,
char *s="We are Chinese!";
char *p; p = strchr(s, 'C')
(3) char *strrchr(char *str, char c);
strrchr函數(shù)返回字符串str從右面算起首次出現(xiàn)字符c的指針,比如我們要從一個(gè)路徑字符串中解析出文件的名字
char *path = "/home/liming/123.txt"
char *fileName = strrchr(path, '/') + 1;
(4) int sscanf(const char *buffer,const char *format[,argument ]...); sscanf 可以從字符buffer中讀進(jìn)與指定格式相符的數(shù)據(jù),這樣在字符串解析式就非常有用
1.比如:
char *str = "Jan 18 2006";
你要將年月日分割出來,就可以這樣
int day;
int year;
char month[4];
sscanf(str, "%s %d %d", month, &day, &year);
2.非常方便,又比如
char *str = "Jan 02 02:02:02 2000"
你要將數(shù)據(jù)分離出來
int year;
char month[4];
int day;
int hour;
int min;
int sec;
sscanf(str, "%s %2d %2d:%2d:%2d %d", month, &day, &hour, &min, &sec, &year);
3.sscanf不一定一空格為分隔符,比如一個(gè)字符串一逗號(hào)‘,’分割數(shù)據(jù)時(shí)
char *str = "werwe,124,455,23234";
char buf[10];
int a1,a2,a3;
sscanf(str, "%[^,],%d,%d,%d", buf, &a1,&a2,&a3);
[^,]表示遇到字符‘,’時(shí)結(jié)束
4.有時(shí)候我們不一定要讀所有的數(shù)據(jù),可能會(huì)跳過一些數(shù)據(jù),這時(shí)可以用%*
char *str = "hi 124 iu 233.3 34"
如果我們只需讀第四和第五個(gè)數(shù)據(jù)時(shí)
double a4;
int a5;
sscanf(str, "%*s %*d %*s %f %d", &a4, &a5);
%*表示略過
|
|