Linux C編程學習6---字串處理、資料轉換

來源:互聯網
上載者:User

標籤:

1.字串
  應用程式按其功能可分為數值計算、非數值計算以及輸入輸出操作等。非數值計算程式占相當大的比例,其核心就是字串處理
  1.1.字元測試
    1.1.1.測試字元是否為英文字母
      int isalpha(int c)。若c為英文字母,則返回非零值,否則傳回值為0
    1.1.2.測試字元是否為數字
      int isdigit(int c)。若c為數字,則返回非零值,否則傳回值為0
  1.2.字串初始化
    在C語言中,字串被當做字元數組來處理,對應於記憶體中的一塊連續的地區
    可以使用 void *memset(void *buffer, int c, int count)來對這塊連續的記憶體初始化
      buffer是指標,指向我們要初始化的連續記憶體的首地址
      參數c,是用來說明將這塊記憶體都初始化為哪個字元,若c為0的話,就是將這塊記憶體清零
      參數count,設定的記憶體的位元組數
    例子

#include<stdio.h>#include<string.h>int main(){char s[]="hello world";printf("%s\n", s);memset(s, ‘H‘, 5);printf("%s\n", s);return 0;}

    輸出結果是:

      hello world
      HHHHH world
  1.3.字串的複製
    1.3.1. char *strcpy(char *dest, char *src)
      將src指向的字串,複製給dest所指向的記憶體。
      注意:這兩個參數所指向的記憶體地區是不允許重疊的
      函數的傳回值是指向 dest的指標
    1.3.2. char *strdup(char *s)
      函數的傳回值是指向被複製的字串的指標,所指向的記憶體地區是系統自動分配的
    1.3.3. void *memcpy(void *dest, void *src, unsigned int count)
      將參數src所指向的記憶體地區複製count個位元組到dest所指向的記憶體地區
      這兩個指標所指向的記憶體地區也是不可以重疊的
      函數的傳回值是指向 dest的指標
      和strcpy 的不同之處在於:memcpy給源記憶體和目標記憶體的指標之後,複製指定大小(unsigned int count)的記憶體,而不檢查記憶體中的具體內容,包括字串的結束符,而前面的strcpy 函數是一旦遇到字串的結束符則立即停止複製
      所以 memcpy並沒有將參數當做字串來看待
    1.3.4. void *memmove(void *dest, const void *src, size_t n)
      將參數src所指向的記憶體地區複製n 個位元組到dest所指向的記憶體地區
      和strcpy、memcpy不同的是這兩個指標所指向的記憶體地區是可以重疊的
      例子

#include<stdio.h>#include<string.h>int main(){char s[] = "Linux C Programming";printf("%s\n", s);memmove(s, s+6, strlen(s)-6);s[strlen(s)-6] = ‘\0‘;printf("%s\n", s);return 0;}

      輸出結果是

        Linux C Programming
        C Programming
  1.4.字串的比較
    1.4.1. int strcmp(const char *s1, const char *s2)
      比較參數s1 和 s2所指向的字串,比較的依據是字元的ASCII碼的值,首先將s1的第一個字元減去s2 的第一個字元,如果相同則繼續比較第二個字元,如此往後比較。如果字串相同,則傳回值為0,如果不相同,則返回不相同出的字元的ASCII碼的差值
    1.4.2. int strncmp(const char *s1, const char * s2, size_t n)
      比較s1 和s2 所指向的字串的前 n個位元組
    1.4.3. int strcasecmp(const char *s1, const char *s2)
      類似於 strcmp,但是在比較的過程中是忽略大小寫
    1.4.4. int strncasecmp(const char *s1, const char *s2, size_t n);
      類似於 strncmp,但是在比較的過程中是忽略大小寫
    1.4.5. int memcmp(const void *s1, const void *s2, size_t n)
      比較s1 和s2 所指向的記憶體空間的前 n個位元組,但是它在比較時候,並不是將 s1 和s2 當做字串的,並不會考慮記憶體地區中的字串結束符
  1.5.字元/字串尋找
    1.5.1. char *index(const char *s, int c)
      在參數s1 做指向的字串中,從前往後尋找字元c,如果找到c 第一次出現的位置,就返回指向這個位置的指標,如果找不到這個字元,就返回 null
      例子

#include<stdio.h>#include<string.h>int main(){char s[] = "hello world";char *p;p = index(s, ‘w‘);printf("%s\n", p);return 0;}

      輸出結果是

        world
    1.5.2. char *rindex(const char *s, int c)
      和 index 類似,不過是從後往前尋找
    1.5.3. char *strchr(const char *s, int c)
      和 index 類似,但是不能尋找 ‘\0‘這個字元。可以用 index(s, ‘\0‘)的形式,但是不能用 strchr(s, ‘\0‘)
    1.5.4. char strrctr(const char *s, int c)
      和 rindex 類似,但是不能尋找 ‘\0‘這個字元。可以用 rindex(s, ‘\0‘)的形式,但是不能用 strrchr(s, ‘\0‘)
    1.5.5. char *strstr(const char *haystack, const char *needle)
      在字串haystack中尋找字串needle,並返回第一次出現的位置,如果沒有找到就返回一個null 指標
  1.6.字串串連分割
    1.6.1. char *strcat(char *dest, const char *src)
      將 src所指向的字串串連到 dest所指向的字串,返回目標指標的起始地址
      注意,目標字串必須有足夠的緩衝區,否則會發生溢出
      例子

#include<stdio.h>#include<string.h>#define BUFFER_SIZE 64int main(){char s[BUFFER_SIZE] = "orld;char d[BUFFER_SIZE] = "hello w";strcat(d, s);printf("%s\n", s);printf("%s\n", d);return 0;}

      輸出結果是

        orld
        hello world
    1.6.2. char *strncat(char *dest, const char *src, size_t n)
      從src 取出n 個位元組,串連到dest 所指向的字串。
      如果src的前n 個位元組中沒有出現‘\0‘,那麼會在結尾處自動添加一個‘\0‘
    1.6.3. char *strtok(char *str, const char *delim)
      將 str字串使用 delim這個分割符號來進行分割。如果在字串str 找到任何一個分隔字元則將其更改為字串的結束符
      例子

#include<strio.h>#include<string.h>int main(){char str[] = "Linux C Programming";char *p;p = strtok(str, " ");while(p != NULL){printf("%s\n", p);p = strtok(NULL, " ");}printf("str : "%s\n", str);return 0;}

      輸出結果是

        C
        Programming
        str : Linux

 

2.資料轉換
  資料轉換包括英文字母大小寫之間的轉換、字串與整數、浮點數之間的轉換
  2.1.字母大小寫轉換
    int toupper(int c) 將小寫英文字母轉換為大寫,如果 c是小寫字母則返回對應的大寫字母,否則返回原來的值
    int tolower(int c) 將大寫英文字母轉換為小寫,原理類似上面的那個
  2.2.字串轉換
    實現字串與整數、浮點數之間轉換
    2.2.1. 將字串轉換為整數
      int atoi(const char *nptr)
      long atol(const char * nptr)
        這兩個函數首先對字串進行掃描,直到出現數字或者加號或減號才開始轉換,然後再出現非數字或者字串結束符就停止轉換並將結果返回
        只能轉換10進位的字串
        例子

#include<stdio.h>#include<string.h>int main(){char a[] = "-100";char b[] = "0x20";int c;c = atoi(a) + atoi(b);printf("c = %d\n", c);return 0;}

  

輸出結果是
-100
因為,將a轉換為 -100,而b是0x20,轉換時,先將0轉換為0,遇到x就停止轉換
2.2.2. 將字串轉換為浮點數
double atof(const char *nptr)
函數首先對字串進行掃描,直到出現數字或者加號或減號才開始轉換,然後再出現非數字或者字串結束符就停止轉換並將結果返回
這個函數中,字串可以包含+、-、小數點、E、e(E、e表示浮點數的指數部分)
2.2.3. 將浮點數轉換為字串
char *gcvt(double number, size_t ndigits, char *buf)
第一個參數是要轉換的浮點數
第二個參數是要顯示的位元
第三個參數是用來存放最終結果的一個緩衝區

Linux C編程學習6---字串處理、資料轉換

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.