前言
??????? 快一周沒更博客了,最近有點忙,今天閑下來了,還是不行,繼續干,書接上回繼續介紹字符串函數:strncpy()、strncat()、strcmp()、strtok()使用、strstr()使用以及模擬實現、strerror()使用。
strncpy()、strncat()、strncmp()
??????? 這幾個函數看著很眼熟,用法確實和前文的函數類似,不同的是多出了一個n,也有一些不同。
strncpy()
??????? 函數參數及其返回類型:
char* strncpy(char* destination , const char* source , size_t num);
//返回值是目的字符串的起始地址
作用:
從源字符串中拷貝num個字符串到目的字符串中。
注意點:
①如果num大于源字符長度,在拷貝完源字符串后,在目標字符串中追加\0,直到num個。
②如果num小于源字符長度,在拷貝完指定字符串后,不會在目標字符串中追加\0。
使用舉例:
?strncat()
??????? 函數參數及其返回類型:
char* strncat(char* destination , const char* source , size_t num);
//返回值是目的字符串的起始地址
作用:
從源字符串中追加前num個字符串到目的字符串中,再追加個\0。
注意點:
①如果num大于源字符長度,只會將源字符串中到\0的字符串追加到目的字符串末尾。
②相較于strcat()函數,strncat()可實現自追加(先用strlen()函數求出字符串長度,再追加),原因也很簡單,strncat()每次追加完畢會自動追加一個\0。
使用舉例:
??strncmp()
??????? 函數參數及其返回類型:
int strncat(const char* str1, const char* str2 , size_t num);
//返回值是大于:大于0的數、等于:0、小于:小于0的數
作用:
比較str1與str2前num個字符
注意點:無
使用舉例:
?strtok()使用
??????? 函數參數及其返回類型:
char* strtok(char* str, const char* sep );
//返回值是指向找到以sep中的字符分隔的字符串的首地址,如果沒找到返回NULL
作用:
找到第一次以sep字符串中的字符分隔的字符串的首地址
注意點:
①sep參數中定義了分隔字符串的集合,也就是說可以為多個分隔字符且可以無序
②當找到第一個以sep中字符分隔的字符串時,將分隔字符以\0替代(strtok()函數會改變源字符,所以一般會使用一個臨時變量來接收,不改變源字符)
③strtok()函數具有記憶性(含有static關鍵字),所以當多次調用strtok()函數時,可將多個字段打印出來
④如果找不到以sep字符串中的字符分隔的字符串,就返回NULL
⑤strtok()函數第一個參數為NULL時,函數將在同一個字符保存的位置找下一個字段
使用舉例:
//strtok()函數舉例
#include<string.h>
int main() {char str[20] = "192.91.89.7";//以“.”分隔的字符串char* sep = ".";//分隔字符(可以為多個)char* ret = NULL;for (ret = strtok(str, sep); ret != NULL;ret=strtok(NULL,sep))//初始化表達式只執行一次,取出第一個字段:ret = strtok(str, sep)//條件表達式用于判斷是否為NULL,為NULL則找不到了:ret != NULL//更新表達式用于查找下一個字段,第一個參數為NULL時,會從上一次分隔位置查找:ret=strtok(NULL,sep)printf("%s\n", ret);return 0;
}
運行結果:
?strstr()使用以及模擬實現
????? 函數參數及其返回類型:
char* strstr(const char* str1, const char* str2 );
//返回值是在str1中第一次出現str2字符串的首地址,如果沒找到返回NULL
作用:
在str1中找str2字符串首次出現的位置
使用舉例:
?模擬實現:
#include<assert.h>
char* my_strstr(const char* str1, const char* str2) {assert(str1 && str2);const char* s1 = NULL;const char* s2 = NULL;const char* cur = str1;//cur直接指向str1while (*cur) {s1 = cur;//s1指向curs2 = str2;//s2變量用來指向str2while (*s1 && *s2 && *s1 == *s2) {//當s1和s2不為\0時繼續找:*s1 && *s2 //滿足條件找下一對字符:*s1 == *s2s1++;s2++;}if (!*s2) {//取反操作判斷是否為\0,為\0說明s2對應到最后一個字符,跳出循環了return cur;}cur++;//cur自增,當一次不滿足時,使指向cur的s1跳到下一個字符繼續匹配}return NULL;//指向str1的cur自增到str1的最后一個字符,還沒匹配成功,說明找不到了,返回NULL
}
//strstr()函數模擬實現
int main() {char str2[100] = "ABC";char str1[100] = "HJKANUABCENNS";char* str;str = my_strstr(str1, str2);printf("%s", str);return 0;
}
運行結果:
?strerror()
?????? 函數參數及其返回類型:
char* strerror(int errornum);
//返回值是整型數字errornum對應的錯誤碼信息首地址
作用:
strerror()函數可以把參數部分對應的錯誤碼返回
注意點:
簡單來說,在C語言編譯器上規定了一些錯誤碼(如棧溢出:strack overflew),一般存放在error.h頭文件中,當C語言程序啟動時,會使用全局變量errno來記錄當前錯誤碼的地址。
errno是一個全局變量用來存放錯誤碼。
使用舉例:
#include<string.h>
int main() {int i;for (i = 0; i < 10; i++) {printf("%s\n", strerror(i));//打印前10條錯誤碼,其中錯誤碼0為無錯}return 0;
}
運行結果:
?值得注意的是使用perror()函數可以直接將當前錯誤碼打印出來(括號內為提示信息,可不傳參)
?