Linux下字串解析的一些方法__Linux
來源:互聯網
上載者:User
轉自:http://blog.chinaunix.net/uid-25808509-id-2930277.html
在linux下編程時,有時候我們需要擷取shell命令的執行結果,一種比較笨的方法是將shell命令的執行結果儲存到檔案,然後在讀檔案,讀完之後,再刪除檔案,或者使用臨時檔案也行。這種方法比較繁瑣,我推薦的一種方法是使用popen函數,FILE *popen(const char *command, const char *type),比如我要擷取ls -l的結果,我們可以這樣做 FILE *stream;
if((stream = popen("ls -l"), r) == NULL)
{
perror("popen");
exit(1);
}
char buf[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: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函數返回字串s中首次出現字元c的指標, char *s="We are Chinese!";
char *p; p = strchr(s, 'C') (3) char *strrchr(char *str, char c); strrchr函數返回字串str從右面算起首次出現字元c的指標,比如我們要從一個路徑字串中解析出檔案的名字 char *path = "/home/liming/123.txt" char *fileName = strrchr(path, '/') + 1;
(4) int sscanf(const char *buffer,const char *format[,argument ]...); sscanf 可以從字元buffer中讀進與指定格式相符的資料,這樣在字串解析式就非常有用 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" 你要將資料分離出來 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不一定一空格為分隔字元,比如一個字串一逗號‘,’分割資料時 char *str = "werwe,124,455,23234"; char buf[10]; int a1,a2,a3; sscanf(str, "%[^,],%d,%d,%d", buf, &a1,&a2,&a3); [^,]表示遇到字元‘,’時結束 4.有時候我們不一定要讀所有的資料,可能會跳過一些資料,這時可以用%* char *str = "hi 124 iu 233.3 34" 如果我們只需讀第四和第五個資料時 double a4; int a5; sscanf(str, "%*s %*d %*s %f %d", &a4, &a5); %*表示略過