標籤:
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---字串處理、資料轉換