c字串和c++字串
在c中,並沒有字串這個資料型別,而是使用字元陣列來儲存字串。c字串實際上就是乙個以null('\0')字元結尾的字元陣列,null字元表示字串的結束。需要注意的是:只有以null字元結尾的字元陣列才是c字串,否則只是一般的c字元陣列。
c字串定義時可以利用"="號進行初始化,但是以後不能利用"="對c字串進行賦值。對c字串的操作需要通過"string"檔案中定義的字串處理函式。例如:
//字串的初始化
char a[11] = "huanying";
//字串的賦值
strcpy(a,"nihao")
//獲取字串的長度,不包括'\0'在內
strlen(a);
printf("%s",a);
在c中也可以使用字元指標來訪問乙個字串,通過字元指標指向存放字串陣列的首元素位址來進行訪問.
char *a = "nihao";
printf("%s",a);
在c++中則把字串封裝成了一種資料型別string,可以直接宣告變數並進行賦值等字串操作。以下是c字串和c++中string的區別:
c字串
string物件
所需的頭檔名稱 或或
為什麼需要標頭檔案
為了使用字串函式
為了使用string類
如何宣告
char name[20];
string name;
如何初始化
char name[20]="nihao";
string name = "nihao";
必須宣告字串長度麼? 是
否使用乙個null字元麼?
是 否
怎樣實現字串賦值
strcpy(name,"john");
name = "john";
其他優點
更快 更易於使用,優選方案
可以賦乙個比現有字元更 不能
可以長的字串麼?
c++常用字串函式
char s1="i am a student";
char s2[20]="teacher";
char s3="student";
int result;
char s4[20],*p;
(1)串長度 int strlen(char *str)
cout< 輸出14
cout< 輸出7
(2)串拷貝 char *strcpy(char *str1,char *str2)
strcpy(s4,s2); //s4為"teacher"
(3)串連線 char *strcat(char *str1,char*str2)
strcat(s2,s3); //s2為"teacherstudent"
//注意:如果使用字元陣列存放字串,strcat函式並不檢查第乙個陣列是否能夠容納第二個字串,這樣多出來的字串就會溢位到相鄰的儲存單元而出現問題。
(4)串比較 int strcmp(char *str1,char *str) //比較的是對應字元的ascii碼值,如果str1>str2,返回1
result=strcmp(s2,s3);
//result>0
result=strcmp(s2,s2);
//result=0
result=strcmp(s3,s2);
//result<0
(5)串定位 char *strchr(char *str,char ch)
p=strchr(s1,'s');
//找到返回字元在字串中的位置,否則返回-1
strcpy(p,s2);
//s1為"i am a teacher"
(6)在乙個串中查詢是否存在和另乙個串相等的子串
(7)擷取子串形成乙個新串
字串的輸入
(1)方法一:使用輸入操符來填充乙個c字串變數
例如:char a[80];
cin>>a;
注:以這種方式來讀取c字串時,會忽略最初的空白字元(空格、製表符和換行符),而且輸入會在下乙個空格或者換行符處停止。
(2)方法二:使用預定義函式getline獲取整行輸入(包括空格)
getline函式有兩個引數:第乙個引數用於接收輸入的c字串變數;第二個引數用於規定getline最多能接收的字元個數。
例如:char a[80];
cin.getline(a,80);
當遇到行結束的時候,輸入才會停止。
c++ string類的輸入
(1)方法一:和c字串輸入的方法一相同。
(2)方法二:使用getline函式。
例如:string a;
getline(cin,a);
string物件和c字串之間的轉換
可以將c字串儲存在string型別的變數中,例如:
char a = "nihao";
string b;
b=a;
但string物件不能自動的轉換為c字串,需要進行顯式的型別轉換,需要用到string類的成員函式c_str().
例如:strcpy(a,b.c_str());
字串到數字的轉換
atoi函式獲取乙個c字串引數,返回對應的int值。如果引數不與乙個int值對應,atoi就會返回0。atoi函式在檔案為cstdlib的庫中。如果數字太大,不能轉換成int型別的值,可以使用atol將字串轉換為long型別的值。
例如:atoi("1234");
//返回整數1234
atoi("#123");
//返回0
擷取字串子串 (1)(gbk)
** @param string $str 原始字串
* @param int $len 需要擷取字串的長度
* @return string 返回擷取到的字串
*/function gbsubstr($str, $len)
return substr($str, 0, $i);}
乙個這樣的字串:「123,456,789,0」。把他擷取成這樣的字串陣列 [123],[456],[789],[0]。眾所周知c++預設沒有提供這樣功能的函式,下面我們自己來實現它
不多說直接上**:
c++**
#include
#include
#include
using namespace std;
vectorsplitex(const string& src, string separate_character)
string laststring = src.substr(lastposition);//擷取最後乙個分隔符後的內容
if (!laststring.empty())
strs.push_back(laststring);//如果最後乙個分隔符後還有內容就入隊
return strs;
} int _tmain(int argc, _tchar* argv)
return 0;
} #include
#include
#include
using namespace std;
vectorsplitex(const string& src, string separate_character)
string laststring = src.substr(lastposition);//擷取最後乙個分隔符後的內容
if (!laststring.empty())
strs.push_back(laststring);//如果最後乙個分隔符後還有內容就入隊
return strs;}
int _tmain(int argc, _tchar* argv)
return 0; }
輸出:123456
7890
888
c++ 字串擷取相關函式講解 1 cstring res;
2 cstring str = _t("abcdefghijklmn");
3 res = str.mid(2,3); //從第3位字母開始,共取3個字元
4 assert(res == _t("cde"));
56 res = str.left(3); //從左邊數起,共取3個字元
7 assert(res == _t("abc"));
89 res = str.right(3); //從右邊數起,共取3個字元
10 assert(res == _t("lmn"));
1112 res = str.spanincluding(_t("edcba")); //遇到引數裡沒有的字元即停下,返回停下之前的字串
13 assert(res == _t("abcde"));
1415 res = str.spanexcluding(_t("fgb")); //遇到引數裡面有的字元即停下,返回停下之前的字串
16 assert(res == _t("a"));17
C 中字串的擷取
string str 123abcd456 int i 3 1 取字串的前i個字元 str str.substring 0,i or str str.remove i,str.length i 2 去掉字串的前i個字元 str str.remove 0,i or str str.substring ...
C 字串擷取
一 1 取字串的前i個字元 1 string str1 str.substring 0,i 2 string str1 str.remove i,str.length i 2 去掉字串的前i個字元 string str1 str.remove 0,i string str1 str.substrin...
C 字串擷取
c 幾個經常用到的字串擷取 一 1 取字串的前i個字元 1 string str1 str.substring 0,i 2 string str1 str.remove i,str.length i 2 去掉字串的前i個字元 string str1 str.remove 0,i string str...