一、函式功能
c 庫函式 char *strtok(char *str, const char *delim) 分解字串 str 為一組字串,delim 為分隔符。
二、函式解析
1.函式原型
char *strtok(char *str, const char *delim)
2.引數
char *str 要被分割的目標字串
char *delim 要分割目標字串的分隔符,必須被包含於目標字串中
3.返回值
函式返回被分解的第乙個子字串,如果沒有可檢索的字串(分隔符),則返回乙個空指標。
三、例項
用c庫字串處理函式,解析gsm模組通過串列埠回傳的字串年、月、日、時、分、秒、經度、緯度,並通過庫函式將字串轉換為int、double的資料型別。
#include #include #include typedef structdata;
int main(void)
; char *buff_data=data_temp;
char * pp ;
buff+=strlen("+cgnsinf:1,1,");//"20200623084942.000,22.537237,113.939234,13.423,0.07,0.0,1,,1.0,1.4,0.9,,10,7,,,37,,";
strncpy(buff_data,buff,4);data.year = atoi(buff_data);//2020
buff+=4;strncpy(buff_data,buff,2);data.mon = atoi(buff_data);//6
//"0623084942.000,22.537237,113.939234,13.423,0.07,0.0,1,,1.0,1.4,0.9,,10,7,,,37,,";
buff+=2;strncpy(buff_data,buff,2);data.day = atoi(buff_data);//23
//"23084942.000,22.537237,113.939234,13.423,0.07,0.0,1,,1.0,1.4,0.9,,10,7,,,37,,";
buff+=2;strncpy(buff_data,buff,2);data.hour = atoi(buff_data);//8
//"084942.000,22.537237,113.939234,13.423,0.07,0.0,1,,1.0,1.4,0.9,,10,7,,,37,,";
buff+=2;strncpy(buff_data,buff,2);data.min = atoi(buff_data);//49
//"4942.000,22.537237,113.939234,13.423,0.07,0.0,1,,1.0,1.4,0.9,,10,7,,,37,,";
buff+=2;strncpy(buff_data,buff,2);data.sec = atoi(buff_data);//42
//"42.000,22.537237,113.939234,13.423,0.07,0.0,1,,1.0,1.4,0.9,,10,7,,,37,,";
strtok(buff,",");
//"22.537237,113.939234,13.423,0.07,0.0,1,,1.0,1.4,0.9,,10,7,,,37,,";
pp=strtok(null,",");//*pp=22.537237
//"113.939234,13.423,0.07,0.0,1,,1.0,1.4,0.9,,10,7,,,37,,";
data.latitude = atof(pp);//double 型別 22.537237
pp=strtok(null,",");//*pp=113.939234
//"13.423,0.07,0.0,1,,1.0,1.4,0.9,,10,7,,,37,,";
data.longitude = atof(pp);//double 型別 113.939234
return 0;
#endif
}
四、注意事項
資料緩衝區的指標必須繫結可用的左值(記憶體單元)
比如在上述實列中,用到了庫函式 char *strncpy(char *dest, const char *src, size_t n),其中的引數char * dest ,傳入的實參必須繫結乙個已經定義好的左值(記憶體單元),因為此函式是將src中的前面n個位元組儲存到dest中,所以dest不能是乙個空指標。
看到這裡有兄弟可能會問,那你定義char *pp 的時候為啥就沒有初始化繫結乙個可用的左值(記憶體單元)。
那是因為char *strtok(char *str, const char *delim) 這個函式執行完成後,返回的是str中分隔符前面的左值(記憶體單元),而我們傳入的str引數肯定是乙個具體的位址,所以通過pp=strtok(null,",");其實是將pp繫結、指向函式返回的左值(記憶體單元)
void lcd_show_ram_image(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1,const unsigned char *data)
else
spi_write((void *)(data+((x1-x0)*(y1-y0)*2/4095)*4095),((x1-x0)*(y1-y0)*2%4095));
lcd_cs_set_1;
} }
分割字串 strtok 函式
在這個競爭的社會,對手無處不在,相信好勝心或者自尊心每個人都有,別人想要時時刻刻處處都要超越你,面對競爭對手或許它會採取各種手段來對付你,不要不相信,這種無恥的人是有的,那麼對待它們首先要做到的一點就是忍,暴力是衝動的不明智的選擇,它只會使你滿足一瞬間的慾望,卻會給自己帶來無窮的傷害,甚至會毀掉自己...
字串分割函式strtok
分解字串為一組字串。s為要分解的字串,delim為分隔符字串。例如 strtok abc,def,ghi 最後可以分割成為abc def ghi.尤其在點分十進位制的ip中提取應用較多。strtok 用來將字串分割成乙個個片段。引數s指向欲分割的字串,引數delim則為分割字串中包含的所有字元。當s...
分割字串函式strtok
char strtok char s,const char delim 作用 分解字串為一組字串。s為要分解的字串,delim為分隔符字串。說明 strtok 用來將字串分割成乙個個片段。引數s指向欲分割的字串,引數delim則為分割字串,當strtok 在引數s的字串中發現到引數delim的分割字...