C語言從零開始(十四)-字符串處理

在軟件開發(fā)過程中,字符串的操作相當頻繁。在標準C語言庫中提供了很多字符串處理的函數(shù)罗捎。今天我們來介紹一些常用的字符串處理函數(shù)捉偏。

1. 字符串輸入輸出

1.1 printf() scanf()

之前我們學習過使用“%c”進行字符的輸入輸出讹躯。字符串的輸入輸出大體相同潮梯,唯一的區(qū)別是采用“%s”。

請看下面這段代碼:

int main()
{
    char str[10];

    printf("Please input 10 words:\n");

    scanf("%s", str);
    printf("%s", str);

    return 0;
}

這段代碼實現(xiàn)的功能是從鍵盤輸入一行字串耙旦,再打印出來萝究。

注意:

  • 字符串數(shù)組str用來接收從鍵盤輸入的字符串
  • str的長度為10,因此不能輸入長度超過10的字符串
  • 如果輸入字符串長度超過10绕娘,內(nèi)存中會越界栽连,這樣就有可能造成系統(tǒng)程序崩潰。但并不是每次都會出現(xiàn)舷暮,因此需要各位注意。

1.2 puts() gets()

  • puts() 把一個字符串打印到屏幕上
  • gets() 從鍵盤讀入一個字符串

這兩個函數(shù)的定義在string.h中复颈,使用時需要添加

#include<string.h>

puts()

  • 格式
    puts(字符數(shù)組)

  • 功能
    向顯示器輸出字符串(輸出完沥割,自動換行机杜,即用)

gets()

  • 格式
    gets(字符數(shù)組)

  • 功能
    從鍵盤輸入一以回車結(jié)束的字符串放入字符數(shù)組中,并自動加"\0"

  • 說明
    輸入串長度應小于字符數(shù)組維數(shù)椒拗,字符串中可以包含空格

例如:

#include<stdio.h>
#include<string.h>

void main()
{
     char str[10];
     int i;
     printf("Please input a string:\n");
     gets(str);

     printf("The input string is:\n");
     puts(str);
}

同樣需要注意數(shù)組長度的問題蚀苛。

2. 字符串轉(zhuǎn)換

字符串經(jīng)常會用到和其他類型進行轉(zhuǎn)換,那么就會用到下面這些函數(shù)腋舌。

2.1 itoa()

  • 功能
    把一整數(shù)轉(zhuǎn)換為字符串渗蟹。itoa是英文integer to array的縮寫
  • 用法
    char *itoa(int value, char* string, int radix);

  • 參數(shù)
    value: 待轉(zhuǎn)化的整數(shù)。
    radix: 是基數(shù)的意思,即先將value轉(zhuǎn)化為radix進制的數(shù)授艰,范圍介于2-36膘怕,比如10表示10進制岛心,16表示16進制篮灼。
    * string: 保存轉(zhuǎn)換后得到的字符串。

  • 返回值
    char * : 指向生成的字符串髓堪, 同*string。

  • 頭文件
    "stdlib.h"
      
    程序例:

     int main()
     {
        int number = 123;
        char string[25];
    
        itoa(number, string, 10);
    
        printf("integer = %d string = %s\n", number, string);
        return 0;
      }
    

2.2 atoi()

  • 功能
    把字符串轉(zhuǎn)換成整型數(shù)驶沼。array to integer 的縮寫.

  • 函數(shù)說明
    atoi()會掃描參數(shù)nptr字符串争群,如果第一個字符不是數(shù)字也不是正負號返回零,否則開始做類型轉(zhuǎn)換玉雾,之后檢測到非數(shù)字或結(jié)束符 \0 時停止轉(zhuǎn)換轻要,返回整型數(shù)。

  • 原型
    int atoi(const char *nptr);

  • 頭文件
    “stdlib.h”
      
    程序例

    int main()
    {
        int n;
        char *str = "12345.67";
        n = atoi(str);
        printf("string = %s integer = %d\n", str, n);
        return 0;
     }
    

執(zhí)行結(jié)果:
string = 12345.67 integer = 12345

2.3 sprintf()

  • 功能
    把格式化的數(shù)據(jù)寫入某個字符串

  • 原型
    int sprintf( char *buffer, const char *format [, argument] … );

  • 返回值
    字符串長度(strlen)

這是一個很有用的函數(shù)驹碍,用法類似printf,只不過它不是把結(jié)果打印在屏幕上柏蘑,而是保存在一個數(shù)組中咳焚。那么它能做什么呢?說兩個最常用的碑定。

int main()
{
    char s[50];
    char who[] = "I";
    char whom[] = "Tianhuaban";

    sprintf(s, "%s am %s.", who, whom);
    printf("%s\n", s);

    sprintf(s, "%10.3f", 3.1415626);
    printf("%s\n", s);

    return 0;
}

第一句sprintf把兩個字符數(shù)組拼接成了一個新數(shù)組又官,寫入s中。第二個sprintf把一個浮點數(shù)格式化后寫入到字符數(shù)組s中碘赖。

3. 字符串常用方法

3.1 strcpy

  • 功能:拷貝一個字符串到另一個
  • 用法:char *stpcpy(char* destin, char* source);

3.2 strcat

  • 功能:字符串拼接函數(shù)
  • 用法:char *strcat(char* destin, char* source);

3.3 strchr

  • 功能:在一個串中查找給定字符的第一個匹配之處
  • 用法:char *strchr(char* str, char c);

3.4 strcmp

  • 功能:串比較
  • 用法:int strcmp(char* str1, char* str2);
  • 說明:

當s1<s2時普泡,返回值<0

當s1=s2時审编,返回值=0
  
當s1>s2時,返回值>0
   
即:兩個字符串自左向右逐個字符相比(按ASCII值大小相比較)砰嘁,直到出現(xiàn)不同的字符或遇'\0'為止。

3.5 strcpy

  • 功能: 串拷貝
  • 用法: char *strcpy(char* str1, char* str2);

3.6 strerror

  • 功能:返回指向錯誤信息字符串的指針
  • 用法:char *strerror(int errnum);

3.7 strset

  • 功能:將一個串中的所有字符都設(shè)為指定字符
  • 用法:char *strset(char* str, char c);

3.8 strstr

  • 功能:在串中查找指定字符串的第一次出現(xiàn)
  • 用法:char *strstr(char* str1, char* str2);

這八個都是非常經(jīng)典的函數(shù)斟冕,具體用法網(wǎng)上非常多板祝。這些不要求記住券时,只要知道有這些功能的函數(shù)即可,需要用的時候立刻能在網(wǎng)上找到答案橘洞。

我是天花板炸枣,讓我們一起在軟件開發(fā)中自我迭代。
如有任何問題适肠,歡迎與我聯(lián)系侯养。


上一篇:C語言從零開始(十三)-字符串與字符數(shù)組
下一篇:C語言從零開始(十五)-二維數(shù)組

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逛揩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子惧笛,更是在濱河造成了極大的恐慌逞泄,老刑警劉巖砖顷,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異嘲碧,居然都是意外死亡父阻,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門履婉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來斟览,“玉大人,你說我怎么就攤上這事已烤〖搜颍” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長净刮。 經(jīng)常有香客問我,道長株婴,這世上最難降的妖魔是什么弹灭? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任穷吮,我火速辦了婚禮,結(jié)果婚禮上八回,老公的妹妹穿的比我還像新娘驾诈。我一直安慰自己,他們只是感情好管引,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布闯两。 她就那樣靜靜地躺著,像睡著了一般重慢。 火紅的嫁衣襯著肌膚如雪似踱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天囚戚,我揣著相機與錄音轧简,去河邊找鬼。 笑死吉懊,一個胖子當著我的面吹牛庐橙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播借嗽,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼态鳖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了恶导?” 一聲冷哼從身側(cè)響起浆竭,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惨寿,沒想到半個月后邦泄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡裂垦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蕉拢。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片特碳。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖晕换,靈堂內(nèi)的尸體忽然破棺而出午乓,到底是詐尸還是另有隱情,我是刑警寧澤闸准,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布益愈,位于F島的核電站,受9級特大地震影響夷家,放射性物質(zhì)發(fā)生泄漏蒸其。R本人自食惡果不足惜或辖,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望枣接。 院中可真熱鬧,春花似錦缺谴、人聲如沸但惶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽膀曾。三九已至,卻和暖如春阳啥,著一層夾襖步出監(jiān)牢的瞬間添谊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工察迟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留斩狱,地道東北人。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓扎瓶,卻偏偏與公主長得像所踊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子概荷,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

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