C語言字符串

在c語言中娄帖,字符串是用字符數(shù)組來存儲的(并不像c++或者java等語言中有單獨的string類型)搬味,

存放時在字符串的末尾增加了表示字符串結(jié)束的標(biāo)志字符'\\0'鳖粟。

字符串雖然是按組成字符串的各個字符存儲在數(shù)組的各個元素中缕贡,但其往往表示一個整體信息曙强,將其分離成單個字符是沒有意義的,所以往往也是將其作為一個整體進行處理涎拉。

下面就幾個方面對字符串進行介紹瑞侮。

1. 字符串?dāng)?shù)組的定義與使用

#include "stdio.h"

void main()

{

char my_string[15];

printf("input a string:");

scanf("%s",my_string);

printf("%s",my_string);

}

輸入是abc124a時輸入輸出如下表示:

input a string:abc124a

abc124a

當(dāng)輸入是123 abc時輸入輸出如下表示:

input a string:123 abc

123

注意:把一個字符數(shù)組看成字符串后的圆,可以直接使用%s來輸入輸出,后面直接使用數(shù)組名半火。

用%s讀入時越妈,表示需要讀入一個字符串到字符數(shù)組中,遇到第一個空格或回車钮糖,讀入即停止梅掠。

讀入時還需要特別注意的是定義的字符數(shù)組的長度應(yīng)該要大于讀入數(shù)據(jù)的長度。

用%s輸出時藐鹤,要注意的是輸出的是字符串的實際長度的那些字符,而不是輸出定義時的字符數(shù)組的長度赂韵。如:

#include "stdio.h"

void main()

{

char my_str[5];

int i;

my_str[4]='K';

printf("input a string:");

scanf("%s", my_str);

printf("%s", my_str);

}

輸入輸出如下:

input a string:2q

2q

這個例子中娱节,

my_str[]數(shù)組的第五個元素是’k’字符,但是讀入這個字符串時只用到了2個元素祭示,即

my_str[0]=2

my_str[1]=q

而%s輸出時僅僅輸出了2q這兩個字符肄满,那么字符串輸出是怎么知道結(jié)束了的呢?

這里會使用到一個默認(rèn)的字符串結(jié)束標(biāo)志字符’\\0’质涛,即此時讀入時稠歉,會在末尾自動加上

my_str[2]=’\\0’,所以輸出時從字符串的頭即0號元素即數(shù)組的首地址一直輸出到’\\0’為止汇陆,并且這個結(jié)束字符本身不會輸出怒炸。

再有,

#include "stdio.h"

void main()

{

char my_str[30]="abab adda";

int i;

printf("%s\\n",my_str);

for(i=0;i<30;i++)

{

printf("%c",my_str[i]);

}

}

輸入輸出如下:

abab adda

abab adda

需要注意的是毡代,這個字符串中有個空格字符阅羹,會正常輸出,不會截斷教寂。

對比下面一個例子捏鱼。利用%s輸入。

#include "stdio.h"

void main()

{

char my_str[30];

scanf("%s",my_str);

printf("%s",my_str);

}

輸入輸出如下:

abab adda

abab

因為%s讀入遇到空格就結(jié)束了酪耕。

2.常用字符類型函數(shù)

字符類型函數(shù)分為兩類:類型判斷類函數(shù)和類型轉(zhuǎn)換類函數(shù)导梆。類型判斷類函數(shù)是用來測試一個字符是否屬于某一類型,如是否為字母迂烁,數(shù)字等看尼。

當(dāng)字符屬于函數(shù)所指定的類型時,函數(shù)返回真值1盟步,否則返回值0.

類型轉(zhuǎn)換類函數(shù)包括兩個函數(shù)狡忙,一個是將字母字符由大寫轉(zhuǎn)換成小寫,另一個是將字母字符由小寫轉(zhuǎn)換成大寫址芯。

常用的字符類型函數(shù)如下:(使用時灾茁,需要引用頭文件 ?)

函數(shù)原型函數(shù)功能描述

int isalunm(int ch)檢查ch是否是字母或數(shù)字

int isalpha(int ch)檢查ch是否是字母

int isdigit(int ch)檢查ch是否是數(shù)字

int islower(int ch)檢查ch是否是小寫字母

int issupper(int ch)檢查ch是否是大寫字母

int iscntrl(int ch)檢查ch是否是控制字母

int tolower(int ch)將大寫字符ch轉(zhuǎn)換成小寫字符

int toupper(int ch)將小寫字符ch轉(zhuǎn)換成大寫字符

int isalunm(int ch)檢查ch是否是字母或數(shù)字

3.字符串操作函數(shù)窜觉。 ?需要引用頭文件

先列出主要的簡介,具體介紹見下文北专。

strtok()字符串分割函數(shù)

strstr()字符串查找函數(shù)

strspn()字符查找函數(shù)

strrchr()定位字符串中最后出現(xiàn)的指定字符

strpbrk()定位字符串中第一個出現(xiàn)的指定字符

strncpy()復(fù)制字符串

strncat()字符串連接函數(shù)

strncasecmp()字符串比較函數(shù)(忽略大小寫)

strlen()字符串長度計算函數(shù)

strdup()復(fù)制字符串

strcspn()查找字符串

strcpy()復(fù)制字符串

strcoll()字符串比較函數(shù)(按字符排列次序)

strcmp()字符串比較函數(shù)(比較字符串)

strchr()字符串查找函數(shù)(返回首次出現(xiàn)字符的位置)

strcat()連接字符串

strcasecmp()字符串比較函數(shù)(忽略大小寫比較字符串)

rindex()字符串查找函數(shù)(返回最后一次出現(xiàn)的位置)

index()字符串查找函數(shù)(返回首次出現(xiàn)的位置)

toupper()字符串轉(zhuǎn)換函數(shù)(小寫轉(zhuǎn)大寫)

tolower()字符串轉(zhuǎn)換函數(shù)(大寫轉(zhuǎn)小寫)

toascii()將整數(shù)轉(zhuǎn)換成合法的ASCII碼字符

strtoul()將字符串轉(zhuǎn)換成無符號長整型數(shù)

strtol()將字符串轉(zhuǎn)換成長整型數(shù)

strtod()將字符串轉(zhuǎn)換成浮點數(shù)

gcvt()將浮點型數(shù)轉(zhuǎn)換為字符串(四舍五入)

atol()將字符串轉(zhuǎn)換成長整型數(shù)

atoi()將字符串轉(zhuǎn)換成整型數(shù)

atof()將字符串轉(zhuǎn)換成浮點型數(shù)

void *memset(void *dest, int c, size_t count);

將dest前面count個字符置為字符c. 返回dest的值.

void *memmove(void *dest, const void *src, size_t count);

從src復(fù)制count字節(jié)的字符到dest. 如果src和dest出現(xiàn)重疊, 函數(shù)會自動處理. 返回dest的值.

void *memcpy(void *dest, const void *src, size_t count);

從src復(fù)制count字節(jié)的字符到dest. 與memmove功能一樣, 只是不能處理src和dest出現(xiàn)重疊. 返回dest的值.

void *memchr(const void *buf, int c, size_t count);

在buf前面count字節(jié)中查找首次出現(xiàn)字符c的位置. 找到了字符c或者已經(jīng)搜尋了count個字節(jié), 查找即停止.

操作成功則返回buf中首次出現(xiàn)c的位置指針, 否則返回NULL.

void *_memccpy(void *dest, const void *src, int c, size_t count);

從src復(fù)制0個或多個字節(jié)的字符到dest. 當(dāng)字符c被復(fù)制或者count個字符被復(fù)制時, 復(fù)制停止.

如果字符c被復(fù)制, 函數(shù)返回這個字符后面緊挨一個字符位置的指針. 否則返回NULL.

int memcmp(const void *buf1, const void *buf2, size_t count);

比較buf1和buf2前面count個字節(jié)大小.

返回值< 0, 表示buf1小于buf2;

返回值為0, 表示buf1等于buf2;

返回值> 0, 表示buf1大于buf2.

int memicmp(const void *buf1, const void *buf2, size_t count);

比較buf1和buf2前面count個字節(jié). 與memcmp不同的是, 它不區(qū)分大小寫.

返回值同上.

size_t strlen(const char *string);

獲取字符串長度, 字符串結(jié)束符NULL不計算在內(nèi).

沒有返回值指示操作錯誤.

char *strrev(char *string);

將字符串string中的字符順序顛倒過來. NULL結(jié)束符位置不變.

返回調(diào)整后的字符串的指針.

char *_strupr(char *string);

將string中所有小寫字母替換成相應(yīng)的大寫字母, 其它字符保持不變.

返回調(diào)整后的字符串的指針.

char *_strlwr(char *string);

將string中所有大寫字母替換成相應(yīng)的小寫字母, 其它字符保持不變.

返回調(diào)整后的字符串的指針.

char *strchr(const char *string, int c);

查找字符c在字符串string中首次出現(xiàn)的位置, NULL結(jié)束符也包含在查找中.

返回一個指針, 指向字符c在字符串string中首次出現(xiàn)的位置, 如果沒有找到, 則返回NULL.

char *strrchr(const char *string, int c);

查找字符c在字符串string中最后一次出現(xiàn)的位置, 也就是對string進行反序搜索, 包含NULL結(jié)束符.

返回一個指針, 指向字符c在字符串string中最后一次出現(xiàn)的位置, 如果沒有找到, 則返回NULL.

char *strstr(const char *string, const char *strSearch);

在字符串string中查找strSearch子串.

返回子串strSearch在string中首次出現(xiàn)位置的指針. 如果沒有找到子串strSearch, 則返回NULL. 如果子串strSearch為空串, 函數(shù)返回string值.

char *strdup(const char *strSource);

函數(shù)運行中會自己調(diào)用malloc函數(shù)為復(fù)制strSource字符串分配存儲空間, 然后再將strSource復(fù)制到分配到的空間中. 注意要及時釋放這個分配的空間.

返回一個指針, 指向為復(fù)制字符串分配的空間; 如果分配空間失敗, 則返回NULL值.

char *strcat(char *strDestination, const char *strSource);

將源串strSource添加到目標(biāo)串strDestination后面, 并在得到的新串后面加上NULL結(jié)束符. 源串strSource的字符會覆蓋目標(biāo)串strDestination后面的結(jié)束符NULL. 在字符串的復(fù)制或添加過程中沒有溢出檢查, 所以要保證目標(biāo)串空間足夠大. 不能處理源串與目標(biāo)串重疊的情況.

函數(shù)返回strDestination值.

char *strncat(char *strDestination, const char *strSource, size_t count);

將源串strSource開始的count個字符添加到目標(biāo)串strDest后. 源串strSource的字符會覆蓋目標(biāo)串strDestination后面的結(jié)束符NULL. 如果count大于源串長度, 則會用源串的長度值替換count值. 得到的新串后面會自動加上NULL結(jié)束符. 與strcat函數(shù)一樣, 本函數(shù)不能處理源串與目標(biāo)串重疊的情況.

函數(shù)返回strDestination值.

char *strcpy(char *strDestination, const char *strSource);

復(fù)制源串strSource到目標(biāo)串strDestination所指定的位置, 包含NULL結(jié)束符. 不能處理源串與目標(biāo)串重疊的情況.

函數(shù)返回strDestination值.

char *strncpy(char *strDestination, const char *strSource, size_t count);

將源串strSource開始的count個字符復(fù)制到目標(biāo)串strDestination所指定的位置. 如果count值小于或等于strSource串的長度, 不會自動添加NULL結(jié)束符目標(biāo)串中, 而count大于strSource串的長度時, 則將strSource用NULL結(jié)束符填充補齊count個字符, 復(fù)制到目標(biāo)串中. 不能處理源串與目標(biāo)串重疊的情況.

函數(shù)返回strDestination值.

char *strset(char *string, int c);

將string串的所有字符設(shè)置為字符c, 遇到NULL結(jié)束符停止.

函數(shù)返回內(nèi)容調(diào)整后的string指針.

char *strnset(char *string, int c, size_t count);

將string串開始count個字符設(shè)置為字符c, 如果count值大于string串的長度, 將用string的長度替換count值.

函數(shù)返回內(nèi)容調(diào)整后的string指針.

size_t strspn(const char *string, const char *strCharSet);

查找任何一個不包含在strCharSet串中的字符 (字符串結(jié)束符NULL除外) 在string串中首次出現(xiàn)的位置序號.

返回一個整數(shù)值, 指定在string中全部由characters中的字符組成的子串的長度. 如果string以一個不包含在strCharSet中的字符開頭, 函數(shù)將返回0值.

size_t strcspn(const char *string, const char *strCharSet);

查找strCharSet串中任何一個字符在string串中首次出現(xiàn)的位置序號, 包含字符串結(jié)束符NULL.

返回一個整數(shù)值, 指定在string中全部由非characters中的字符組成的子串的長度. 如果string以一個包含在strCharSet中的字符開頭, 函數(shù)將返回0值.

char *strspnp(const char *string, const char *strCharSet);

查找任何一個不包含在strCharSet串中的字符 (字符串結(jié)束符NULL除外) 在string串中首次出現(xiàn)的位置指針.

返回一個指針, 指向非strCharSet中的字符在string中首次出現(xiàn)的位置.

char *strpbrk(const char *string, const char *strCharSet);

查找strCharSet串中任何一個字符在string串中首次出現(xiàn)的位置, 不包含字符串結(jié)束符NULL.

返回一個指針, 指向strCharSet中任一字符在string中首次出現(xiàn)的位置. 如果兩個字符串參數(shù)不含相同字符, 則返回NULL值.

int strcmp(const char *string1, const char *string2);

比較字符串string1和string2大小.

返回值< 0, 表示string1小于string2;

返回值為0, 表示string1等于string2;

返回值> 0, 表示string1大于string2.

int stricmp(const char *string1, const char *string2);

比較字符串string1和string2大小禀挫,和strcmp不同, 比較的是它們的小寫字母版本.

返回值與strcmp相同.

int strcmpi(const char *string1, const char *string2);

等價于stricmp函數(shù), 只是提供一個向后兼容的版本.

int strncmp(const char *string1, const char *string2, size_t count);

比較字符串string1和string2大小,只比較前面count個字符. 比較過程中, 任何一個字符串的長度小于count, 則count將被較短的字符串的長度取代. 此時如果兩串前面的字符都相等, 則較短的串要小.

返回值< 0, 表示string1的子串小于string2的子串;

返回值為0, 表示string1的子串等于string2的子串;

返回值> 0, 表示string1的子串大于string2的子串.

int strnicmp(const char *string1, const char *string2, size_t count);

比較字符串string1和string2大小拓颓,只比較前面count個字符. 與strncmp不同的是, 比較的是它們的小寫字母版本.

返回值與strncmp相同.

char *strtok(char *strToken, const char *strDelimit);

在strToken 串中查找下一個標(biāo)記, strDelimit字符集則指定了在當(dāng)前查找調(diào)用中可能遇到的分界符.

返回一個指針, 指向在strToken中找到的下一個標(biāo)記. 如果找不到標(biāo)記, 就返回NULL值. 每次調(diào)用都會修改strToken內(nèi)容, 用NULL字符替換遇到的每個分界符.

至此语婴,字符串操作差不多就介紹完了。

上文還有一個疑問驶睦,就是如何讀入例如 I love you 這樣斷斷續(xù)續(xù)的字符串砰左。這個問題我之后將會去重新學(xué)習(xí)一下輸入輸出語句,到時候再和大家一同分享场航。

下面缠导,以一簡單的實例介紹本篇博客。

問題描述:判斷一個由a~z這26個字符組成的字符串中哪個字符出現(xiàn)的次數(shù)最多溉痢。

輸入:第一行是測試數(shù)據(jù)的組數(shù)n(n<=10),每組測試數(shù)據(jù)占一行僻造,不超過80字符且非空、

輸出:一行輸出包括出現(xiàn)次數(shù)最多的字符和該字符出現(xiàn)的次數(shù)孩饼,中間是一個空格髓削,如果次數(shù)相同,輸出ASCII碼最小的字符镀娶。

由于比較簡單立膛,我就直接上代碼了。不懂的相信看了代碼也能明白的梯码、

#include "stdio.h"

void main()

{

char str[81];

int count[26], i, k, n; ?//26個字母的計數(shù)器

scanf("%d",&n); ? //測試數(shù)據(jù)組數(shù)

while (n-->0)

{

scanf("%s",str); ? //讀入字符串

for (i=0; i<26; i++) ? //初始化字符串旧巾,個數(shù)清0

{

count[i] = 0;

}

i = 0;

while ( str[i] != '\\0')

{

count[str[i] - 'a']++; ? ? ? ? //對出現(xiàn)的字符計數(shù)

i++;

}

k = 0;

for (i=1; i<26; i++)

{

if (count[i] > count[k])

{

k = i; ? ? ? ? ? ? ? ? ? ? ? ? //查找次數(shù)最多的

}

}

printf("%c %d\\n", 'a'+k,count[k]);

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市忍些,隨后出現(xiàn)的幾起案子鲁猩,更是在濱河造成了極大的恐慌,老刑警劉巖罢坝,帶你破解...
    沈念sama閱讀 223,207評論 6 521
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件廓握,死亡現(xiàn)場離奇詭異,居然都是意外死亡嘁酿,警方通過查閱死者的電腦和手機隙券,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,455評論 3 400
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闹司,“玉大人娱仔,你說我怎么就攤上這事∮巫” “怎么了牲迫?”我有些...
    開封第一講書人閱讀 170,031評論 0 366
  • 文/不壞的土叔 我叫張陵耐朴,是天一觀的道長。 經(jīng)常有香客問我盹憎,道長筛峭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,334評論 1 300
  • 正文 為了忘掉前任陪每,我火速辦了婚禮影晓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘檩禾。我一直安慰自己挂签,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,322評論 6 398
  • 文/花漫 我一把揭開白布盼产。 她就那樣靜靜地躺著饵婆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辆飘。 梳的紋絲不亂的頭發(fā)上啦辐,一...
    開封第一講書人閱讀 52,895評論 1 314
  • 那天谓传,我揣著相機與錄音蜈项,去河邊找鬼。 笑死续挟,一個胖子當(dāng)著我的面吹牛紧卒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播诗祸,決...
    沈念sama閱讀 41,300評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼跑芳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了直颅?” 一聲冷哼從身側(cè)響起博个,我...
    開封第一講書人閱讀 40,264評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎功偿,沒想到半個月后盆佣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,784評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡械荷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,870評論 3 343
  • 正文 我和宋清朗相戀三年共耍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吨瞎。...
    茶點故事閱讀 40,989評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡痹兜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出颤诀,到底是詐尸還是另有隱情字旭,我是刑警寧澤对湃,帶...
    沈念sama閱讀 36,649評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站谐算,受9級特大地震影響熟尉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜洲脂,卻給世界環(huán)境...
    茶點故事閱讀 42,331評論 3 336
  • 文/蒙蒙 一斤儿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恐锦,春花似錦往果、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,814評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至潘飘,卻和暖如春肮之,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背卜录。 一陣腳步聲響...
    開封第一講書人閱讀 33,940評論 1 275
  • 我被黑心中介騙來泰國打工戈擒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人艰毒。 一個月前我還...
    沈念sama閱讀 49,452評論 3 379
  • 正文 我出身青樓筐高,卻偏偏與公主長得像,于是被迫代替她去往敵國和親丑瞧。 傳聞我的和親對象是個殘疾皇子柑土,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,995評論 2 361

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