1.char*和char都可以表示字串
2.char可讀可寫,可以修改字串的內容。char*可讀不可寫,寫入就會導致段錯誤(具體原因不清楚)
因此可以解釋,當直接對char*型別的指標變數寫入資料時,會導致段錯誤,需要使用char
1、char *a = "hello" 中的a是指向第乙個字元bai『a'的乙個指標
2、char a[20] = "hello" 中陣列du名a也是執行陣列第乙個字元『h』的指標
但二者並不相同:看例項:把兩個字串相加
顯示結果:hello0123456789
顯示結果:segmentation fault
把字串加到指標所指的字串上去,出現段錯誤,本質原因:*d="0123456789"存放在常量區,是無法修的。而陣列是存放在棧中,是可以修改的。兩者區別如下:
1、 」讀「 」寫「 能力
char *a = "abcd"; 此時"abcd"存放在常量區。通過指標只可以訪問字串常量,而不可以改變它
而char a[20] = "abcd"; 此時 "abcd"存放在棧。可以通過指標去訪問和修改陣列內容
2、賦值時刻
char *a = "abcd"; 是在編譯時就確定了(因為為常量)
而char a[20] = "abcd"; 在執行時確定
3、 訪問效率
char *a = "abcd"; 存於靜態儲存區。在棧上的陣列比指標所指向字串快。因此慢
而char a[20] = "abcd"; 存於棧上
我們知道一點,*代表取值符。
其次,我們要明白一點,以為*p可指向以zhi為陣列,**p指向二維陣列,***p指向三dao維陣列......
最後()在不同的情況下有不同的含義。好現在開始講解*char(**)與(char*)的區別
1、*char(**)應該表示乙個指向二維陣列的指標,其效果等同於乙個三維數指標
2、(char*)我給出以下兩種含義:
a、可定義乙個字元型指標
b、將當前物件顯示轉換為字元指標型別
#include#includeusing
namespace
std;
intmain()
#include#includeusing
namespace
std;
intmain()
//char *轉const char *
char *st = "
hehe
"; //
(編譯提示警告)
const
char *st1 =st;
cout
<< st1 << endl;
//const char *轉char *
const
char *st = "
lala";
//直接賦值不可以
//char *st1 = st;
//(不可以編譯器報錯)
//cout << st1 << endl;
//另外開闢空間,將字元乙個乙個複製過去
char *ncstr = new
char[strlen(st) + 1
];strcpy(ncstr, st);
cout
<< ncstr << endl;
//char*轉換為string
//(注意,定義char *變數,並直接賦值,最好定義為const變數,否則編譯器警告)
const
char *st = "
hello";
//賦值轉換
string st1 =st;
cout
<< st1 <
//構造轉換
string s1(st, st +strlen(st));
cout
<< s1 <
//改變const char *變數值
st = "
lalala";
cout
<< st <
string轉char *:賦值操作(注意型別轉換)
//string轉char *
string st = "
my test";
//char *st1 = st;
//錯誤型別不同
//char *st1 = st.c_str();
//錯誤型別不同
char *st1 = const_cast(st.c_str()) ;
cout
<< st1 << endl;
char 轉string:1)直接賦值;2所以當我們在c裡要處理乙個 char* 型別的資料 那麼就需要 我們轉成 char)構造轉換實現
//char轉換為string
char st = "
hello";
//直接賦值實現
string st1 =st;
cout
<< st1 <
//構造實現
string st2(st, st +strlen(st));
cout
<< st2 <
string轉char:拷貝實現,不能直接賦值
//string轉char
string ts = "
my test1";
//char ts1 = ts;
//錯誤
//char ts1 = const_cast(ts.c_str());
//錯誤
char ts1 = "
lalallalalaaaa";
strncpy(ts1, ts.c_str(), ts.length() + 1); //
注意,一定要加1,否則沒有賦值'\0'
cout << ts1 <
return
0;
vs2019 中是這樣的
char *str1 = (char *) "方式一:使用strtokthis is - www.666.com - website";
char str = ;
strcpy(str,str1);
//"this is - www.666.com - website";
char s[2] = "-"
;
char*token;
char* dest[8] = ;
int num = 0
; split(str,s,dest,&num);
# include # include方式二:void split(char *src,const
char *separator,char **dest,int *num)
*num =count;
}
intmain(); //
存放分割後的子字串
//分割後子字串的個數
int num = 0
;
split(buf,",
",revbuf,&num); //
呼叫函式進行分割
//輸出返回的每個內容
for(i = 0;i < num; i ++)
return0;
}
使用strchr
void split(char * p,char *str);char *p1 = (char *)malloc(1024);
while((p1 = (char *)strchr(p, *str)) != null) //
必須使用(char *)進行強制型別轉換
strncpy(tmp[i], p, strlen(p));
for(j = 0; j <= i; j++)}
action ()
linux c c 字串 操作之 split
linux c 字串 操作之 分割 split include include 分割字串成二維陣列 可根據傳入分割符來計算出二維陣列長度大小 param msg 需要分割的字串 param splitchar 用於分割字串的字元 param arrlen 返回二維資料的長度,用於遍歷 return ...
c 中字串split函式
寫這個只是用來記憶一下,時至今日才發現c 的cstring類中已經有了字串分split的函式,自己一直沒有發現,羞愧難當,不過還好我是乙個知恥後勇的人,既然今天發現了,那就記下來。cstring中有乙個strtok s函式,它是乙個分割字串安全函式,其函式原型如下 char strtok s cha...
split分割字串
string tmp weekcode.split new char string yr tmp 0 string wk tmp 1 string tmp regex.split eachl,error regexoptions.ignorecase 用字串來分割 error 把 以 error 為...