C的字串操作 split

2022-02-01 17:37:23 字數 4268 閱讀 5915

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#include

using

namespace

std;

intmain()

#include#include

using

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

)構造轉換實現

//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;

所以當我們在c裡要處理乙個  char*  型別的資料 那麼就需要 我們轉成 char

vs2019 中是這樣的

char *str1 = (char *) "

this 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);

方式一:使用strtok

# 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 為...