strtok函式分割字串的使用

2021-10-07 22:12:25 字數 3031 閱讀 7045

一、函式功能

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的分割字...