1. 程式人生 > >C/C++字符串使用整理

C/C++字符串使用整理

upper 介紹 puts strlen %d sprint 八進制 sep can

前言

字符串類型,即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++字符串使用整理