C/C++字符串使用整理
前言
字符串類型,即string類型,因為使用方便,不必擔心內存問題,越界問題等等,還有在不太確定即將存入的字符串長度的時候使用是非常好的。本片中,將會對string類型的字符串和char類型的字符串對比使用講解,作為隨筆筆記,記錄常用的用法,同時也會隨著見識的增長隨時更新
舉栗子
string 類型字符串在使用的時候需要加上頭文件#include<string>,而char類型的字符串數組在使用的時候往往要加上頭文件#include<cstring>才能夠使用。下面對比介紹string類型和char類型字符串的用法
(接下來的例子給變量命名我都用的是str1,str2…)
聲明:
string str1,str2 char str1[MAXSIZE],str2[MAXSIZE] //假定要定義的char類型字符串數組的大小為MAXSIZE
比較:>,==,<,>=,<=等
String類型:str1==str2;str1>=str2;str1<=str2 就不一一列舉了,可以看出,string類型字符串比較是非常方便的,直接就像int類型那樣直接比就可以了(當然比法是不一樣的)
Char類型:strcmp(str1,str2); 有返回值的,str1<str2 返回負數,str1==str2返回為0,str1>str2返回正數。某真心感覺很麻煩,每次比較都要用函數,當然也可以進行運算符重載直接像string類型那樣比較,如果不嫌麻煩的話。
復制拷貝:
將str2中內容復制到str1中
string類型:str1=str2 char類型:strcpy(str1,str2);
string類型變量在定義的時候還可以拷貝構造函數,如string str1(str2);
連接:
將str2中內容連接到str1後頭
String 類型:str1+=str2 char類型:strcat(str1,str2);
統計字符個數(字符串長度):
統計字符串中字符的個數:
String類型:str1.length(); str1.size();返回的值都是str1的長度
Char 類型:strlen(str1); 返回的值是str1的長度
String類型:str1..~string();
或者:str1=””;
將char類型字符串轉換成string類型:
char str1=”***”;
string str2(str1);
將string類型轉換成char類型:
strcpy(str2,str1.c_str());
前邊的str2是char類型的字符串,後邊str1是string類型的。註意轉換千萬別越界
string中的某一個字符是可以直接保存到char類型字符中的,例如
string str=”123”
如ch=str[1];
那麽輸出ch打印出來的是2
字符串中的某一字符轉換成int類型數字:
int num=str[i]-‘0’;
字符串類型與整數類型互相轉換:
字符串轉換成整數:
用atoi()函數,C語言中頭文件是#include<stdlib.h>(C++中是#include<cstdlib>)
用法:atoi只能轉char *類型的,如果是string類型的,需先轉成char類型
int num=atoi(str);
整數轉換成字符串:
Itoa()函數,將整數轉換成char類型
itoa(num,str, radix);
num是int類型數字,str是最終轉換成char的結果,radix是用多少進制保存,如2、8、10、16進制等
字符串中查找子串:
find()函數:
字符串詳細內容見大神博客:http://blog.csdn.net/laobai1015/article/details/62426137
基本用法
int key=find(str1,str2);
其中str1、str2都是string類型,函數的意思是在str1中查找str2第一次出現的位置並返回這個值,如果不存在則返回-1
strstr()函數:
char *str3=strstr(str1,str2);
str1,str2均為char*類型,函數的意思是在str1中查找str2,返回第一次出現str2的地址,如果沒有找到則返回空
例如str1=”My name is”; str2=”name”;
那麽返回的str3為“name is”;
string類型中,字符串字串的截取:
substr()函數,用於string類型
string str;
str.substr(startnum, len);
其中 startnum 是起始字符的序號,len是從起始字符開始截取的字符串長度
那麽,若要截取str中序號m到n間(其中不包括n)的子字符串則為
str.substr(m, n-m);
strtok()函數,用於char類型
char *str=strtok(str1,str2);
將字符串str1沿著str2切割,返回的是char*
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.基礎函數
輸入輸出:cin,cout,getchar,gets,putchar,puts,printf,scanf
格式化:sprintf,sprintf_s,wsprintf,wsprintf_s,swprintf,swprintf_s (請仔細比較這幾組函數的區別)
格式化值:
%% -返回百分號
%b –返回二進制數
%c –返回與ASCII值相對應的字符
%d –帶有正負號的十進制數
%e –科學計數符號(如:1.2e+2)
%u –不帶正負號的十進制數.%ul 不帶符號的長整型
%f – 浮點數據(本地設置)
%F –浮點數據(非本地設置)
%o –八進制數
%s –字符串
%x –十六進制數(小寫字母) 例如:sprintf(s, "%#010x", 128); //產生"0x00000080"
%X –十六進制數(大寫字母)
char*字符串處理:strlen,strcpy,strcat,strcmp
2.進階函數
char*字符串處理:
char * strchar(const char * s, int c) ;返回指向字符串s中字符c首次出現的指針,沒有返回NULL
char * strrchar(const char * s, int c) ;返回指向字符串s中字符c最後一次出現的指針,沒有返回NULL
char * strstr(const char * s1, const char * s2) ;返回指向字符串s1中首次出現s2位置的指針,無返回NULL
size_t strspn(const char * s1, const char * s2) ;返回s1中只包含s2中字符的起始段的長度
size_t strcspn(const char * s1, const char * s2) ;返回s1中不包含s2中字符的起始段的長度
char * strpbrk(const char * s1, const char * s2) ;返回指向s1中首次出現s2中字符位置的指針,沒有返回NULL
char * strtok(char * s1, const char * s2) 將s1用s2中包含的字符分開記號拆散為字符串。(註意:strtok會修改輸入的字符串,故請拷貝後再調用。)
char *strsep(char **stringp, const char *delim) 同上,分隔字符串,用法類似
string字符串處理:
長度:str.length()
尺寸:str.size()
比較:str1.compare(str2)
連接:str1+=str2
連接:str1.append(str2)
提取:str2=str2.substr(pos1)
查找:pos=str1.find(str2)
插入:str1.insert(pos1,str2);
替換:str1.replace(pos1,str2);
刪除:str1.erase(pos,len)
清除:str.clear()
字符串轉數字:
atoi(將字符串轉換成整型數)
atof(將字符串轉換成浮點型數)
atol(將字符串轉換成長整型數)
strtod(將字符串轉換成雙精度浮點數)
strtol(將字符串轉換成長整型數)
strtoul(將字符串轉換成無符號長整型數)
字符判斷:
isalnum:Check if character is alphanumeric (function)
isalpha :Check if character is alphabetic (function)
iscntrl :Check if character is a control character (function)
isdigit :Check if character is decimal digit (function)
isgraph :Check if character has graphical representation (function )
islower :Check if character is lowercase letter (function)
isprint :Check if character is printable (function)
ispunct :Check if character is a punctuation character (function)
isspace :Check if character is a white-space (function )--空白字符:新行符\n, 空格,回車‘‘\r",水平制表符"\t", 垂直制表符"\v"
isupper :Check if character is uppercase letter (function)
isxdigit :Check if character is hexadecimal digit (function)
tolower:Convert uppercase letter to lowercase (function)
toupper:Convert lowercase letter to uppercase (function)
內存操作:
void * memcpy(void * s1, const void * s2, size_t n) ; 將s2中連續n個字節的數據拷貝到s1中 ,註意s1和s2內存區域不能重疊
void * memmve(void * s1, const void * s2, size_t n) ; 將s2中連續n個字節的數據拷貝到s1中 ,但s1和s2內存區域可以重疊
int memcmp(const void * s1, const void * s2, size_t n) ; 比較內存區域s1和s2的前n個字節,<、=、>分別返回負值、0、正值。
void * memchr(const void * s, int c, size_t n) ; 返回指向s1對象的前n個字節查找出現c的位置的指針,沒有返回NULL
void * memset(void * s, int c, size_t n) ; 將c拷貝到s1中的前n個字節中,常用於字符串初始化,初始化也可以寫char *str={0}
格式轉換:
char*到string:可以直接賦值
string轉char*:str.c_str()
char*和wchar_t*互轉:比較復雜,綜合運用多種函數。
C/C++字符串使用整理