http://blog.csdn.net/wangqing_12345/article/details/51760220
1,字符串切割函數?
函數原型:char *strtok(char *s, char *delim);
函數功能:把字符串s按照字符串delim進行分割,然后返回分割的結果。
函數使用說:
1.strtok函數的實質上的處理是,strtok在s中查找包含在delim中的字符并用NULL(’/0′)來替換,直到找遍整個字符串。這句話有兩層含義:(1)每次調用strtok函數只能獲得一個分割單位。(2)要獲得所有的分割單元必須反復調用strtok函數。
2.strtok函數以后的調用時的需用NULL來替換s.
3.形參s(要分割的字符串)對應的變量應用char s[]=”….”形式,而不能用char *s=”….”形式。
例子如下:
#include <stdio.h>?
#include <string.h>
int?main(void)
{
????? char buf[]=”Golden Global View”;
??????char* token = strtok( buf, " ");
????? while( token != NULL )
????? {
?????????? printf( ”%s “, token );
?????????? token = strtok( NULL, ” “);
????? }
????? return 0;
}
其結果為:
Golden
Global
View
?
但是如果我們把char buf[]=”Golden Global View”;換成char *buf=”Golden Global View”; 則會出錯,原因是如果分配的大小一樣的前提下char *p和char b[]也是有區別的,
char *p="abc";
char b[]="abc";
當這兩個語句編譯后,編譯器會將“abc”放在常量區中,而strtok(char *s, char *delim)函數是在s中查找包含在delim中的字符并用NULL(’/0′)來替換,直到找遍整個字符串。這句話就能體現指針和數組的區別:既然查找就要p++/b++。 要替換成(‘/0’),那么就要對*p/*b賦值
*p='/0';
*b='/0';
p指針是指向常量字符串的,對*p操作就是對字符串操作,這顯然會編譯不通過的。
b是字符數組的首地址,這個數組里面的元素是‘a’、'b'、'c'、'/0',和字符串“abc”看上去是一樣,不過并不是同一個。相當于,b數組里可以存放其他東西'1'、'2'、'3'、'/0',只不過在編譯到char b[]="abc";后給這個b數組里的元素值改變了,所以對*b的操作并不影響字符串。
如果我們把token = strtok( NULL, ” “);換成token = strtok( buf, " ");則while循環會成為一個無限循環,而輸出的結果就只為:Golden。我的解釋原因如下: 在strtok函數體中有一個char 類型的指針(假設為 char *p),它的作用就是令p=s,用于保存s的起始地址。由于在隨后的處理中指針p的值會一直保存(C語言中指針的特點),因此在以后的strtok調用中用NULL來代替s的原因就是防止p被重新賦值而指向s的起始地址,從而可以保證p可以指向s的其他位置,直到最后分割完整個字符串。 但是如果用s來代替NULL,那么每次調用strtok時,p就會指向s的初始地址,從而只能獲得第一個分割出來的字串,如上面的例子中while會是一個無限循環,而輸出的結果只能是“Golden”。
??? strstr()函數用來檢索子串在字符串中首次出現的位置,其原型為:
? ? char *strstr( char *str, char * substr );
【參數說明】str為要檢索的字符串,substr為要檢索的子串。
【返回值】返回字符串str中第一次出現子串substr的地址;如果沒有檢索到子串,則返回NULL。
【函數示例】strstr()函數的使用。
- #include<stdio.h>
- #include<string.h>
- int main(){
- // 也可以改成 char str[] = "http://see.xidian.edu.cn/cpp/u/xitong/";
- char *str = "http://see.xidian.edu.cn/cpp/u/xitong/";
- char *substr = "see";
- char *s = strstr(str, substr);
- printf("%s\n", s);
- return 0;
- }
see.xidian.edu.cn/cpp/u/xitong/?
3,查找字符在字符串中首次出現的位置
??? strchr() 用來查找某字符在字符串中首次出現的位置,其原型為:
? ? char * strchr (const char *str, int c);
【參數】str 為要查找的字符串,c 為要查找的字符。
strchr() 將會找出 str 字符串中第一次出現的字符 c 的地址,然后將該地址返回。
注意:字符串 str 的結束標志 NUL 也會被納入檢索范圍,所以 str 的組后一個字符也可以被定位。
【返回值】如果找到指定的字符則返回該字符所在地址,否則返回 NULL。
返回的地址是字符串在內存中隨機分配的地址再加上你所搜索的字符在字符串位置。設字符在字符串中首次出現的位置為 i,那么返回的地址可以理解為 str + i。
提示:如果希望查找某字符在字符串中最后一次出現的位置,可以使用?strrchr()?函數。
【實例】查找字符5首次出現的位置。
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- int main(){
- ??? char *s = "0123456789012345678901234567890";
- ??? char *p;
- ??? p = strchr(s, '5');
- printf("%ld\n", s);
- ??? printf("%ld\n", p);
- system("pause");
- ??? return 0;
- }
12016464
12016469?
4,獲取字符串指定位置間的字符串
str.substr(startpos, length);
其中 startpos 是起始字符的序號,length 是[從 startpos 開始]取的字符串長度(包括
startpos )。
如果要取得 str 中序號 m 到 n 之間(不包括n)的子字符串需要用
str.substr(m, n-m);
?
#include<string>
#include<iostream>
using namespace std;
main()
{
string s("12345asdf");
string a=s.substr(0,4);?????? //獲得字符串s中 從第0位開始的長度為4的字符串
cout<<a<<endl;
}
輸出結果為:
1234