strtok()函數并不像你想的那樣可以一次切割字串。需要多次循環,第二次時需要用 p = strtok(NULL, " "); 這樣的 形式。
我們提供的服務有:網站建設、網站制作、微信公眾號開發、網站優化、網站認證、介休ssl等。為上1000+企事業單位解決了網站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的介休網站制作公司
void main()
{ char test1[] = "Hello C World";
char *p;
p = strtok(test1, " ");
while(p)
{
printf("%s\n", p);
p = strtok(NULL, " ");
}
return 0;
}
運行結果:
Hello
C
World
直接的問題出在這句:
strcpy(str,s2);
strtok返回的指針,指向是str中相對位置;你s2之后,把s2再拷貝會str,這時的str變成了(A,C),而前面的s1指向的是str的相對位置,因此s1的指向,也從原來的(A,B)變成了(A,C),因此后面的結果也變了。
你起碼應該引入新變量,char str2[]; 然后
strcpy(str2,s2);
又:strtok會破壞原來的字符串;strcpy不要用在“源”和“目的”重疊的地方(你例子中str和s2就重疊了);后面的strcpy(v1,S5),應該注意檢測s5是否為NULL,否則容易出問題;同理strcpy(v2, s6)亦然。
char *___strtok;//關鍵這個全局指針變量
char * strtok(char * s,const char * ct)
{
char *sbegin, *send;
sbegin = s ? s : ___strtok;//不等于NULL用原始字符串,否則用___strtok
if (!sbegin) {
return NULL;//結尾
}
sbegin += strspn(sbegin,ct);//
if (*sbegin == '/0') {
___strtok = NULL;
return( NULL );
}
send = strpbrk( sbegin, ct);
if (send *send != '/0')
*send++ = '/0';
___strtok = send;
return (sbegin);
}
這個是strtok函數原型.你可以參考一下
#include string.h char *strtok( char *str1, const char *str2 ); 功能:函數返回字符串str1中緊接“標記”的部分的指針, 字符串str2是作為標記的分隔符。如果分隔標記沒有找到,函數返回NULL。為了將字符串轉換成標記,第一次調用str1 指向作為標記的分隔符。之后所以的調用str1 都應為NULL。
例如:
char str[] = "now # is the time for all # good men to come to the # aid of their country"; char delims[] = "#"; char *result = NULL; result = strtok( str, delims ); while( result != NULL ) { printf( "result is \"%s\"\n", result ); result = strtok( NULL, delims ); } 以上代碼的運行結果是:
result is "now " result is " is the time for all " result is " good men to come to the " result is " aid of their country" 相關主題:
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之后還要在程序中使用這個字符串,則應復制這個字 符串。