08-C語言字符串

字符串

  • 將字符串到一起就是字符串,有序 / 同類型的 ---> 數(shù)組
  • 其實(shí)C語言中的字符串就是一個(gè)特殊的數(shù)組而已
  • 如果用數(shù)組表示字符串,那么數(shù)組必須是char類型,而且最后一個(gè)元素必須是\0
  • 在c語言中除了可以用字符數(shù)組來表示字符串以外,還可以用雙引號(hào)" " 來表示字符串
以下就是一個(gè)字符串
char str1[] = {'c','w','w','\0'};

// 如果在定義的同時(shí)部分初始化,沒有被賦值的元素會(huì)被自動(dòng)賦值為0;
char str2[5] = {'c','w','w'};

char str3[] = "cww"; // 底層就是 {'c','w','w','\0'};

以下是一個(gè)字符數(shù)組,不是字符串
char str4[] = {'c','w','w'};

printf("str1 = %s\n",str1); // cww
printf("str2 = %s\n",str2); // cww
printf("str3 = %s\n",str3); // cww
printf("str4 = %s\n",str4); // cwwcww

image
  • 特別注意:字符串在內(nèi)存中存儲(chǔ)是連續(xù)的,只有遇到\0接結(jié)束
image

字符串常用方法

puts

  • 格式: puts(字符數(shù)組名)
  • 功能: 把字符數(shù)組中的字符串顯示到控制臺(tái)
  • 優(yōu)點(diǎn): 可以換行,可以是任意元素地址
```
char str1[] = "cww";
// printf + %s 輸出不會(huì)自動(dòng)換行,必須手動(dòng)添加\n
printf("str = %s\n",str);
puts(str); // 會(huì)自動(dòng)換行
printf("被換行");
```
![image](http://upload-images.jianshu.io/upload_images/7924287-73fd597a05f01451.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

gets

  • 格式:gets(字符數(shù)組名);
  • 功能:從鍵盤中輸入一個(gè)字符串
```
char str2[10];
// scanf接收用戶輸入,
// scanf輸入的數(shù)據(jù)中不能有空格/TAB/回車
scanf("%s", &str2);

//gets接收字符串,可以輸入空格/TAB
// gets(str2);
printf("str2 = %s\n", str2);
```

strlen

  • 功能:計(jì)算字符串的長(zhǎng)度
  • 利用sizeof計(jì)算字符串長(zhǎng)度
```
char str1[] = "cww";
int len = sizeof(str1) / sizeof(str1[0]); 
// 注意這里計(jì)算是字符串占用內(nèi)存單元的字節(jié)數(shù)
// 實(shí)際是len = len -1;
```

- 利用系統(tǒng)函數(shù)strlen計(jì)算
    - 注意: **在使用strlen要引入頭文件 #include <string.h>;**
```
char str2[] = "cww";
strlen(str2);
```    
  • 自定義strlen函數(shù)
```
/**
 * @brief getStrlen  實(shí)現(xiàn)strlen函數(shù)
 * @param str        傳入字符串
 * @return  len 長(zhǎng)度
 */
int getStrlen (char str[]){
    int len = 0;
    while(str[len] != '\0'){
        len++;
    }
    return len;
}
```
  • 指針版
```
/**
 * @brief getStrlen  實(shí)現(xiàn)strlen函數(shù)
 * @param str        傳入字符串
 * @return  len 長(zhǎng)度
 */
int myStrlen(char *str){
    int index = 0;
    while(*str++){
        index++;
    }
    return index;
}
```
  • 注意點(diǎn): *str++ 是先將地址加1在訪問地址所存儲(chǔ)的內(nèi)容;
```
/**
 * @brief getStrlen  實(shí)現(xiàn)strlen函數(shù)
 * @param str        傳入字符串
 * @return  len 長(zhǎng)度
 */
int myStrlen(char *str){
    char *startP = str;
    while(*str++);
    str--;
    return str - startP;

}

```

strcat

  • 注意: 在使用strlen要引入頭文件 #include <string.h>;
  • 格式:strcat(字符數(shù)組名1,字符數(shù)組名2);
  • 功能:把字符數(shù)組2中的字符串連接到字符數(shù)組1中字符串的后面,
  • 注意點(diǎn):前面的數(shù)組必修足夠長(zhǎng),否則在企業(yè)中會(huì)引發(fā)一些未知的BUG
```

char str1[10] = "cww";
char str2[4] = "ppp";
strcat(str1, str2);
printf("str1 = %s\n",str1);  // cwwppp

```
  • 自己封裝的strcat函數(shù)
```

/**
 * @brief myStrcat  實(shí)現(xiàn)字符串的拼接
 * @param str1      傳入字符串1
 * @param str2      傳入字符串2
 */
void myStrcat(char *str1, char *str2){
    //printf("%s\n",str1);
    int index = 0;
    // 取出str1中存儲(chǔ)的地址
    //printf("str1 = %p\n",str1);
    //printf("str1 = %c\n",*str1);
    while(*str1++) {
        index++;
    }
    //printf("str1 = %p\n",str1);
//    while (str1[index] != '\0') {
//        index++;
//    }
    printf("index = %i\n", index);
    int value = 0;
    while(str2[value] != '\0'){
        str1[index] = str2[value];
        index++;
        value++;
    }

    // printf("index = %i\n", index);
    str1[index] = '\0';
}
```
  • 指針版
```
/**
 * @brief myStrcat    指針優(yōu)化的strcat函數(shù)
 * @param str1       傳入字符串1
 * @param str2      傳入字符串2
 */
void myStrcat(char *str1, char *str2){
    while(*str1++);
    str1--;
    while(*str2){
        *str1 = *str2;
        str1++;
        str2++;
    }
    *str1 = '\0';
}
```

strcpy

  • 注意: 在使用strlen要引入頭文件 #include <string.h>;
  • 格式: strcpy(字符數(shù)組1,字符數(shù)組名2);
  • 功能: 把字符數(shù)組2中的字符串拷貝到字符數(shù)組1中.字符串結(jié)束標(biāo)志'\0'也一同拷貝.
  • 注意點(diǎn):前面的數(shù)組必修足夠長(zhǎng),否則在企業(yè)中會(huì)引發(fā)一些未知的BUG
```
char str1[10] = "cww";
char str2[4] = "ppp";
strcpy(str1,str2);
printf("str1 = %s\n",str1); // ppp
printf("str2 = %s\n",str2); // ppp
```
  • 自定義strcpy函數(shù)
```
#include <stdio.h>
#include <string.h>
void myStrcpy(char *str1, char *str2);
int main()
{
    char str1[] = "cwww";
    char str2[] = "ppppp";
    //strcpy(str1, str2);
    myStrcpy(str1, str2);
    printf("str1 = %s\n", str1);
    return 0;
}

/**
 * @brief myStrcpy  實(shí)現(xiàn)strcpy函數(shù)
 * @param str1      傳入字符串1
 * @param str2      傳入字符串2
 */
void myStrcpy(char *str1, char *str2){
    int index = 0;
    while (str2[index] != '\0') {
        str1[index] = str2[index];
        index++;
    }
    str1[index] = '\0';
}

```
  • 指標(biāo)版
```
/**
 * @brief myStrcpy  指針實(shí)現(xiàn)strcpy函數(shù)
 * @param str1      傳入字符串1
 * @param str2      傳入字符串2
 */
void myStrcpy(char *str1, char *str2){
    while(*str2){
        *str1 = *str2;
        str1++;
        str2++;
    }
    *str1 = '\0';
}
```

strcmp

  • 注意: 在使用strlen要引入頭文件 #include <string.h>;
  • 格式: strcmp(字符數(shù)組名1,字符數(shù)組名2)
  • 功能: 按照ASCII碼順序比較兩個(gè)數(shù)組中的字符串,并右函數(shù)返回值返回比較結(jié)果
    • 字符串1 = 字符串2, 返回值 = 0;
    • 字符串1 > 字符串2, 返回值 > 0;
    • 字符串1 < 字符串2, 返回值 < 0;
    • 如果前面的內(nèi)容都相同, 第一個(gè)參數(shù)的個(gè)數(shù)小于第二個(gè)參數(shù), 返回 -1 負(fù)數(shù)
    • 如果前面的內(nèi)容都相同, 第一個(gè)參數(shù)的個(gè)數(shù)大于第二個(gè)參數(shù), 返回 1 正數(shù)
```
char str1[10] = "124";
char str2[4] = "123";
int res = strcmp(str1,str2);
printf("res = %i\n", res);  // 1
```
  • 自定義strcmp
```
#include <stdio.h>
#include <string.h>
int myStrcmp(char *str1, char *str2);
int main()
{
    char str1[] = "1224";
    char str2[] = "12233";
    int res1 = strcmp(str1, str2);
    printf("res1 = %i\n", res1);

    int res2 = myStrcmp(str1, str2);
    printf("res2 = %i\n", res2);
    return 0;
}

/**
 * @brief myStrcmp  實(shí)現(xiàn)strcmp函數(shù)
 * @param str1      傳入第一個(gè)字符串
 * @param str2      傳入第二個(gè)字符串
 * @return 
 */
int myStrcmp(char *str1, char *str2){
    int index = 0;
    while (str1[index] != '\0' || str2[index] != '\0') {
        if(str1[index] > str2[index]){
            return 1;
        }else if(str1[index] < str2[index]){
            return -1;
        }
        index++;
    }
    return 0;
}

```
  • 指針版
```

/**
 * @brief myStrcmp  指針實(shí)現(xiàn)strcmp函數(shù)
 * @param str1      傳入第一個(gè)字符串
 * @param str2      傳入第二個(gè)字符串
 * @return
 */
int myStrcmp(char *str1, char *str2){
    while (*str1 || *str2) {
        if(*str1 > *str2){
            return 1;
        }else if(*str1 < *str2){
            return -1;
        }
        str1++;
        str2++;
    }
    return 0;
}
```

字符串?dāng)?shù)組

  • 字符串?dāng)?shù)組其實(shí)就是定義一個(gè)數(shù)組保存所有的字符串
char names1[2][6] = {{'c','w','w','\0'},{'p','p','p'}};
char names2[2][6] = {{"cww"},{"ppp"}};
char names3[2][6] = {"cww","ppp"};

  • 指針定義字符串
char *str1 = "cww";
char *str2 = "abc";
char *str3 = "def";
char *str{
    str1,
    str2,
    str3
};

// 字符串?dāng)?shù)組的第二種格式
char *str[] = {
    "cww",
    "abc",
    "def"
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拱烁,一起剝皮案震驚了整個(gè)濱河市具滴,隨后出現(xiàn)的幾起案子荧飞,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡版述,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門寞冯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來渴析,“玉大人,你說我怎么就攤上這事吮龄〖蠹耄” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵漓帚,是天一觀的道長(zhǎng)母债。 經(jīng)常有香客問我,道長(zhǎng)尝抖,這世上最難降的妖魔是什么毡们? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮昧辽,結(jié)果婚禮上衙熔,老公的妹妹穿的比我還像新娘。我一直安慰自己搅荞,他們只是感情好红氯,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布框咙。 她就那樣靜靜地躺著,像睡著了一般痢甘。 火紅的嫁衣襯著肌膚如雪喇嘱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天塞栅,我揣著相機(jī)與錄音婉称,去河邊找鬼。 笑死构蹬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的悔据。 我是一名探鬼主播庄敛,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼科汗!你這毒婦竟也來了藻烤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤头滔,失蹤者是張志新(化名)和其女友劉穎怖亭,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坤检,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兴猩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了早歇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片倾芝。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖箭跳,靈堂內(nèi)的尸體忽然破棺而出晨另,到底是詐尸還是另有隱情,我是刑警寧澤谱姓,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布借尿,位于F島的核電站,受9級(jí)特大地震影響屉来,放射性物質(zhì)發(fā)生泄漏路翻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一奶躯、第九天 我趴在偏房一處隱蔽的房頂上張望帚桩。 院中可真熱鬧,春花似錦嘹黔、人聲如沸账嚎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽郭蕉。三九已至疼邀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間召锈,已是汗流浹背旁振。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留涨岁,地道東北人拐袜。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像梢薪,于是被迫代替她去往敵國(guó)和親蹬铺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容