一、strerror函數源碼
strerror函數是C標準庫中用來將errno值轉為可讀錯誤信息的函數。errno是系統和函數調用時產生的錯誤標識。strerror源碼如下:
char *strerror(int errnum) { static char buf[BUF_SIZE]; //BUF_SIZE表示最大可用的錯誤字符串長度 if (errnum = _sys_nerr || _sys_errlist[errnum] == NULL) { snprintf(buf, BUF_SIZE, "Unknown error %d", errnum); //若錯誤碼不在區間[0,_sys_nerr)中,則返回"Unknown error [錯誤碼]" } else { snprintf(buf, BUF_SIZE, "%s", _sys_errlist[errnum]); //否則返回對應錯誤碼的字符串 } return buf; }
該函數通過在全局變量_sys_errlist中查找對應錯誤碼的字符串,並將其拷貝到靜態的緩衝區buf中,返回buf的地址。如果不在可處理範圍內,則返回默認字符串「Unknown error [錯誤碼]」。
二、返回當前errno值
errno是一個宏,可用於在C程序中查詢函數調用的錯誤。errno在頭文件中定義。errno值反映上一次系統調用執行時發生的錯誤狀態。示例代碼如下:
#include #include #include int main() { FILE *fp; fp = fopen("non-existent-file.txt", "r"); // 將嘗試打開一個不存在的文件 if (fp == NULL) { printf("打開文件失敗,錯誤碼:%d,錯誤信息:%s\n", errno, strerror(errno)); } else { // 處理讀取文件的代碼 } return 0; }
上述代碼中,文件指針fp的值將為NULL,因為嘗試打開的文件不存在。此時,errno為2,對應常量為ENOENT,即No such file or directory。使用strerror函數將錯誤碼轉為錯誤信息字符串並輸出。
三、strerror函數頭文件
在使用strerror函數之前需要進行頭文件包含。strerror函數聲明在中,應當在源文件頂部加上以下語句:
#include
四、strerror函數和perror
perror函數用於在標準錯誤流stderr上輸出錯誤信息,它將參數中的字符串和errno對應的錯誤信息一起輸出。perror函數的源碼如下:
void perror(const char *s) { fprintf(stderr, "%s: %s\n", (s == NULL) ? "" : s, strerror(errno)); }
其中s是一個字符串,若非空,它將在錯誤信息前輸出。此外,strerror(errno)返回的是靜態內存空間的指針。perror函數直接輸出這個指針的內容到標準錯誤流中,所以可以直接使用perror輸出錯誤信息,代碼如下所示:
#include #include int main() { FILE *fp; fp = fopen("non-existent-file.txt", "r"); if (fp == NULL) { perror("打開文件失敗"); } else { // 處理讀取文件的代碼 } return 0; }
五、strreverse函數
strreverse函數會將字符串原址翻轉。源碼如下:
char *strreverse(char *str) { if (str == NULL) return NULL; unsigned int len = strlen(str); char temp; for (int i=0; i<len/2; i++) { temp = str[i]; str[i] = str[len-i-1]; str[len-i-1] = temp; } return str; }
該函數先判斷了參數是否為NULL,可以避免出現引用空指針的情況。然後獲取了字符串長度len,使用交換的方式將前一半和後一半字符嚴格對稱的位置進行交換。最後返回原址。
六、strrchr函數
strrchr函數用於在一個字符串中查找一個給定的字符,返回該字符在字符串中最後一次出現的位置。如果未找到,函數返回NULL。源碼和示例代碼如下:
char *strrchr(const char *s, int c) { const char *last = NULL; do { if (*s == (char)c) { last = s; } } while (*s++ != '\0'); return (char *)last; } #include #include int main() { char str[] = "Hello, world!"; char *p = strrchr(str, 'o'); if (p != NULL) { printf("最後一個o在%s的第%d個位置\n", str, p-str+1); } else { printf("未找到o字符\n"); } return 0; }
上述代碼中,char *p = strrchr(str, ‘o’)將返回最後一個字符o的位置,用指針p指向該位置,然後p-str+1得到字符在字符串中的位置。若未找到字符o,則返回NULL。
七、strrev函數
strrev函數用來翻轉一個字符串。源碼如下:
char *strrev(char *str) { if (str == NULL) return NULL; char *p1, *p2; p1 = str; p2 = str + strlen(str) - 1; while (p1 < p2) { char temp; temp = *p1; *p1 = *p2; *p2 = temp; p1++; p2--; } return str; }
該函數使用雙指針迭代的方式將字符串頭和尾位置的字符依次進行交換。返回字符串原址。
八、strtrim函數
strtrim函數用於從字符串的首尾刪除空格字符(包括\t、\n、\v、\f、\r、空格)。
char *strtrim(char *str) { if (str == NULL) return NULL; int len = strlen(str); char *p1, *p2; p1 = str; while (*p1 != '\0' && isspace(*p1)) { p1++; } p2 = str + len - 1; while (p2 > p1 && isspace(*p2)) { p2--; } *(p2+1) = '\0'; return p1; }
該函數首先判斷字符串是否為NULL,然後使用指針p1找到字符串首部出現的第一個非空格字符位置。然後使用指針p2找到字符串尾部出現的第一個非空格字符位置的前一個位置,因為該字符直到該位置都應該保留,而不是實際刪除。刪除尾部空格的方法是將尾指針遞減直到p1之前,加上’\0’表示字符串的結束。最後返回字符串指向p1的指針。
結尾
本文詳細介紹了strerror函數及其相關函數的含義、源碼和使用。strerror函數可以將errno值轉換為可讀的錯誤信息字符串;errno表示了函數調用時返回的錯誤碼。strreverse、strrchr、strrev、strtrim函數分別用於字符串翻轉、查找最後一個字符位置、翻轉字符串、刪除首尾空格。熟練掌握這些函數可以使程序開發更加便捷和高效。
原創文章,作者:TCPCR,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/313273.html