經常使用strtok函數進行文本操作,其實他是一個很好用的函數,很方便,能夠簡單的實現一行文本的切分操作,總結一下使用心得。
函數原型char* strtok(char* s,const char* delim)
首先strtok有兩個參數,第一個參數是要操作的數據的地址或稱爲指針,通常是通過fget(buff,length(buff),p)函數來獲取的,這裏buff就是char* s,本人經常獲取文本的一行數據進行操作,所以這是一貫套路,當然有例外。第二個參數就是分隔符,使用最多的分隔符就是" "(空格),TAB(製表符)等等操作符,本人經操作的是空格符號爲分隔符。所以當讀取s指向的字符串中遇到分隔符時,就會把分隔符改成'\0'返回這個片段的指針或地址。舉個例子來說明問題,這裏有一個待處理文本如下:
xiaoming 123456 shanghai
zhangming 123 shangdong
hanmeimei 987 beijing
這裏有三行文本,每一行有三個屬性,名字,編號,地址構成,這裏就需要你實現顯示每一行的每個屬性的功能。
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int main(int argc,char **argv)
{
string strname,strid,straddress;
char buff[256];
FILE *p;
p=fopen("data.txt","r");
while(fgets(buff,256,p)!=NULL)
{
strname=strtok(buff," ");//這裏要注意的是一行文本中在第一次使用strtok的時候,第一個參數要使用待處理數據的首地址
strid=strtok(NULL," ");//但是在該行的以後使用中第一個參數就要用NULL,這一點很重要,往往被人忽視
straddress=strtok(NULL,"\n");//更加要注意的一點是,在分割該行最後一個屬性的時候,很多人對於分隔符的選取仍然是" "(空格),這樣是不正
//確的,應該使用"\n"來分割,因爲最後的符號是"\n"而不是空格,如果繼續使用空格作爲分隔符的話,那麼最後一個屬性就多了一個"\n"了。
cout<<strname<<" "<<strid<<" "<<straddress<<endl;
}
return 0;
}