Ⅰ c++裡面,函數strtok怎麼用
函數strtok將字元串分解為一系列標記(token)標記就是一系列用分隔符(delimiting chracter,通常是空格或標點符號)分開的字元。例如,在一行文本中,每個單詞可以作為標記,空格是分隔符。
需要多次調用strtok才能將字元串分解為標記(假設字元串中包含多個標記)。第一次調用strtok包含兩個參數,即要標記化的字元串和包含用來分隔標記的字元的字元串(即分隔符):在圖5.33的例子中,下列語句:
tokenPtr = Strtok(string, " ");
將tokenPtr賦給string中第一個標記的指針。strtok的第二個參數」」表示string中的標記用空格分開。
函數strtok搜索string中不是分隔符(空格)的第一個字元,這是第一個標記的開頭。然後函數尋找字元串中的下一個分隔符,將其換成null(, w,)字元,這是當前標記的終點。函數strtok保存string中標記後面的下一個字元的指針,並返回當前標記的指針。
/* strtok example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] ="- This, a sample string.";
char * pch;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok (str," ,.-");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ,.-");
}
return 0;
}
Output:
Splitting string "- This, a sample string." into tokens:
This
a
sample
string
後面再調用strtok時,第一個參數為NULL,繼續將string標記化。NULL參數表示調用strtok繼續從string中上次調用 strtok時保存的位置開始標記化。如果調用strtok時已經沒有標記,則strtok返回NULL。圖5.33的程序用strtok將字元串」 This is sentence with 7 tokens」標記化。分別列印每個標記。注意strtok修改輸入字元串,因此,如果調用strtok之後還要在程序中使用這個字元串,則應復制這個字 符串。
Ⅱ C語言strtok函數使用問題。
#include<stdio.h>
#include<string.h>
#include<malloc.h>//動態內存分配函數malloc和free的頭文件
int main()
{
int i,s;
char *a,*p,*str[100];
a=(char*)malloc(sizeof(char)*100);//開辟一個最大位元組長度為100的空間
scanf("%[^\n]",a);//將開辟的空間拿來做字元串,使用scanf無法輸入空格後面的[^\n]過濾了換行符之後的字元,這樣就沒事了
getchar();//還需要吸收垃圾字元,這個不能沒有否則會出現死循環
p=strtok(a," ");//第一次以空格符分割
for(s=0;p;s++)//當p為空時跳出
{
str[s]=p;//將分割的傳給指針數組str,str相當於字元串數組
p=strtok(NULL," ");//接著在分割
}
printf("%s",str[0]);
for(i=1;i<s;i++)
printf(" %s",str[i]);
printf("\n");
free(a);//釋放內存
return 0;
}
VC++6.0測試通過
Ⅲ C語言strtok_r使用循環的時候,第二次循環只能取到NULL
需要看下你的二位數組xy_check的定義,才知道是不是定義有問題。
Ⅳ c語言,關於strtok
strtok會修改字元串,將分隔符處的字元換成\0。
你這里對常量字元串調用strtok,所以出錯了。
http://www.cplusplus.com/reference/clibrary/cstring/strtok/
Ⅳ C語言strtok函數能過濾換行符或者回車符嗎
strtok(str , " "); 這樣寫應該可以
charstr[128];
char*p;
strcpy(str,"123 456 789 012 ");
p=strtok(str," ");
while(p)
{
printf("p=[%s]",p);
p=strtok(NULL," ");
}
Ⅵ char *strtok_r(char *s, const char *delim, char **ptrptr);中char **ptrptr是幹嘛的
大部分*_r這種形式的函數基本都是可重入的函數,也可以認為是線程安全的函數,像這個函數strtok是用delim來切割s字元串,每次返回最新的切割結果,對於這個函數來說,每次執行都必須知道上一次的執行結果,因此每次執行都需要保存本次執行的狀態,對於沒有_r的函數,函數中使用static變數,但是在多線程時,很可能會出錯,因此這個ptrptr所指向的地址保存的就是當前線程的調用結果,這樣不同線程調用這個函數的時候就不會出錯了, 具體是什麼內容用戶不必知道,只需要傳入一個有效的地址就行了。
Ⅶ strtok_r的strtok的函數原型
為char *strtok_r(char *str, const char *delim, char **saveptr);
strtok_r函數是strtok函數的可重入版本。str為要分解的字元串,delim為分隔符字元串。char **saveptr參數是一個指向char *的指針變數,用來在strtok_r內部保存切分時的上下文,以應對連續調用分解相同源字元串。
第一次調用strtok_r時,str參數必須指向待提取的字元串,saveptr參數的值可以忽略。連續調用時,str賦值為NULL,saveptr為上次調用後返回的值,不要修改。一系列不同的字元串可能會同時連續調用strtok_r進行提取,要為不同的調用傳遞不同的saveptr參數。
strtok_r實際上就是將strtok內部隱式保存的this指針,以參數的形式與函數外部進行交互。由調用者進行傳遞、保存甚至是修改。需要調用者在連續切分相同源字元串時,除了將str參數賦值為NULL,還要傳遞上次切分時保存下的saveptr。

Ⅷ strtok_r函數
free 和 malloc 是對應的。如果從標准庫或者系統庫中得到的指針,一定是由庫來維護的。從strtok_r輸出的緩沖是在內部分配的,在程序結束的時候,庫會進行釋放操作的。如果你最後free了,就會造成double free的錯誤。
----------------------------------------
myStrBuf是從strtok_r輸出的緩沖,系統對把分配到的一個緩沖的地址傳給myStrBuf。但是具體是malloc還是其他帶位元組對齊的分配方法,這個由系統決定的。你只要記住一點,在你自己的程序裡面有幾個malloc就有幾個free,不能多也不能少。其他的指針系統會管理的
------------------------------------------
程序最後是需要free的。free(str)但不是myStrBuf
Ⅸ POSIX定義了一個線程安全的函數——strtok_r,以此來代替strtok
POSIX是指POSIX標准,是描述Unix兼容的操作系統、平台等的一系列標准,可以參考這里:http://ke..com/view/209573.htm。
C POSIX函數庫是POSIX系統上的一個語言無關(但使用了C函數調用約定)的函數庫。*nix等POSIX系統所用的C標准庫實現(例如glibc)同時實現了POSIX函數庫。
Ⅹ C語言中strtok用法
strtok函數會破壞被分解字元串的完整,調用前和調用後的s已經不一樣了。如果要保持原字元串的完整,可以使用strchr和sscanf的組合等。
strtok是一個線程不安全的函數,因為它使用了靜態分配的空間來存儲被分割的字元串位置
線程安全的函數叫strtok_r,ca。
運用strtok來判斷ip或者mac的時候務必要先用其他的方法判斷'.'或':'的個數,因為用strtok截斷的話,比如:"192..168.0...8..."這個字元串,strtok只會截取四次,中間的...無論多少都會被當作一個key。
函數strtok保存string中標記後面的下一個字元的指針,並返回當前標記的指針。
後面再調用strtok時,第一個參數為NULL,繼續將string標記化。NULL參數表示調用strtok繼續從string中上次調用 strtok時保存的位置開始標記化。
如果調用strtok時已經沒有標記,則strtok返回NULL。注意strtok修改輸入字元串,因此,如果調用strtok之後還要在程序中使用這個字元串,則應復制這個字 符串。