【C语言】C语言中的字符函数和字符串函数全解析
前言
在C语言编程中,字符和字符串的处理是必不可少的。C语言标准库提供了丰富的字符和字符串函数,这些函数极大地简化了字符和字符串的操作。本文将详细介绍这些函数的使用方法、模拟实现以及一些实用的代码示例,帮助你更好地理解和掌握它们。
一、字符分类函数
字符分类函数用于判断字符的类型,这些函数都包含在ctype.h头文件中。例如,islower(int c)函数用于判断一个字符是否为小写字母。如果参数c是小写字母,则返回非零整数;否则返回0。
#include <stdio.h>
#include <ctype.h>
int main()
{int ret = islower('A');printf("%d\n", ret);ret = islower('a');printf("%d\n", ret);ret = islower('0');printf("%d\n", ret);return 0;
}
int main()
{int ret = isxdigit('9');printf("%d\n", ret);return 0;
}
示例代码:将字符串中的小写字母转换为大写
#include <stdio.h>
#include <ctype.h>
int main()
{char arr[] = "I am a Student.";int i = 0;while (arr[i] != '\0'){if (islower(arr[i])){arr[i] = arr[i] - 32;}i++;}printf("%s\n", arr);return 0;
}
二、字符转换函数
C语言提供了两个字符转换函数:tolower(int c)和toupper(int c)。tolower函数将大写字母转换为小写,而toupper函数将小写字母转换为大写。
示例代码:使用toupper函数将字符串中的小写字母转换为大写
#include <stdio.h>
#include <ctype.h>int main()
{char arr[] = "I am a Student.";int i = 0;while (arr[i] != '\0'){if (islower(arr[i])){arr[i] = toupper(arr[i]);}i++;}printf("%s\n", arr);return 0;
}
int main()
{char ch = toupper('a');printf("%c\n", ch);ch = tolower('A');printf("%c\n", ch);return 0;
}
int main()
{char arr[] = "I am a student.";int i = 0;while (arr[i] != '\0'){if (islower(arr[i])){arr[i] = toupper(arr[i]);}i++;}printf("%s\n", arr);return 0;
}
三、strlen的使用和模拟实现
strlen(const char *str)函数用于计算字符串的长度,返回字符串中’\0’之前的字符个数。需要注意的是,strlen的返回值类型是size_t,这是一个无符号类型。
示例代码:使用strlen比较两个字符串的长度
#include <stdio.h>
#include <string.h>int main()
{if (strlen("abc") - strlen("abcdef") > 0){printf(">\n");}else{printf("<\n");}
}
因为是size_t类型,所以得到的结果永远都是>=0的数
int main()
{if ((int)strlen("abc") - (int)strlen("abcdef") > 0){printf(">\n");}else{printf("<\n");}
}
strlen的模拟实现
方法1:计数器方式
int my_strlen(const char *str)
{int count = 0;assert(str);while (*str){count++;str++;}return count;
}
方法2:递归方式
int my_strlen(const char *str)
{assert(str);if (*str == '\0')return 0;elsereturn 1 + my_strlen(str + 1);
}
方法3:指针差值方式
#include <assert.h>size_t my_strlen(const char* str)
{const char* start = str;assert(str != NULL);while (*str != '\0'){str++;}return str - start;
}
int main()
{char arr[] = "abcdef";size_t len = my_strlen(arr);printf("%zd\n", len);return 0;
}
四、strcpy的使用和模拟实现
strcpy(char *destination, const char *source)函数用于将源字符串source复制到目标字符串destination中,包括终止符’\0’。目标字符串必须有足够的空间来存储源字符串。
#include <string.h>int main()
{char arr1[] = "hello world";char arr2[20] = { 0 };strcpy(arr2, arr1);printf("%s\n", arr2);return 0;
}
示例代码:模拟实现strcpy
#include<assert.h>char* my_strcpy(char* dest, const char* src)
{assert(dest);assert(src);char* ret = dest;while (*dest++ = *src++)//拷贝过去后,判断表达式的值,当\0拷贝过去后,停止拷贝{;}return ret;
}int main()
{char arr1[] = "abcdef";char arr2[20] = { 0 };char* pstr = my_strcpy(arr2, arr1);printf("%s\n", arr2);printf("%s\n", pstr);printf("%s\n", my_strcpy(arr2,arr1));return 0;
}
五、strcat的使用和模拟实现
strcat(char *destination, const char *source)函数用于将源字符串source追加到目标字符串destination的末尾。目标字符串必须有足够的空间来存储追加后的字符串。
#include <string.h>int main()
{char arr1[20] = "he\0lloxxxxx";char arr2[] = "world";char arr[20] = "abc";strcat(arr, arr);printf("%s\n", arr);return 0;
}
示例代码:模拟实现strcat
char *my_strcat(char *dest, const char *src)
{char *ret = dest;assert(dest != NULL);assert(src != NULL);while (*dest){dest++;}while ((*dest++ = *src++)){;}return ret;
}
六、strcmp的使用和模拟实现
strcmp(const char *str1, const char *str2)函数用于比较两个字符串。如果第一个字符串大于第二个字符串,则返回大于0的值;如果两个字符串相等,则返回0;如果第一个字符串小于第二个字符串,则返回小于0的值。
int main()
{char arr1[] = "abq";char arr2[] = "abcdef";int ret = strcmp(arr1, arr2);printf("%d\n", ret);if (ret > 0){printf(">\n");}else{printf("<\n");}return 0;
}
示例代码:模拟实现strcmp
int my_strcmp(const char *str1, const char *str2)
{assert(str1 != NULL);assert(str2 != NULL);while (*str1 == *str2){if (*str1 == '\0')return 0;str1++;str2++;}return *str1 - *str2;
}
七、strncpy函数的使用
strncpy(char *destination, const char *source, size_t num)函数用于将源字符串的前num个字符复制到目标字符串中。如果源字符串的长度小于num,则在目标字符串的末尾填充零,直到总长度达到num。
int main()
{char arr1[20] = "abcdef";char arr2[20] = "xxxxxxxxxxxxxx";strncpy(arr2, arr1, 8);printf("%s\n", arr2);return 0;
}
八、strncat函数的使用
strncat(char *destination, const char *source, size_t num)函数用于将源字符串的前num个字符追加到目标字符串的末尾,并在末尾添加终止符’\0’。
示例代码:使用strncat
#include <stdio.h>
#include <string.h>int main()
{char str1[20];char str2[20];strcpy(str1, "To be ");strcpy(str2, "or not to be");strncat(str1, str2, 6);printf("%s\n", str1);return 0;
}
九、strncmp函数的使用
strncmp(const char *str1, const char *str2, size_t num)函数用于比较两个字符串的前num个字符。如果两个字符串的前num个字符相等,则返回0;否则返回非零值。
十、strstr的使用和模拟实现
strstr(const char *str1, const char *str2)函数用于查找字符串str2在字符串str1中第一次出现的位置。如果找到,则返回指向该位置的指针;否则返回空指针。
示例代码:使用strstr
#include <stdio.h>
#include <string.h>int main()
{char arr[] = "abcdefabcdef";char* p = "efab";char* ret = strstr(arr, p);printf("%s\n", ret);return 0;
}
strstr的模拟实现
#include <assert.h>
const char* my_strstr(const char* str1, const char* str2)
{assert(str1 && str2);const char* s1 = NULL;const char* s2 = NULL;const char* cur = str1;if (*str2 == '\0'){return str1;}while (*cur){s1 = cur;s2 = str2;while (*s1 && *s2 && *s1 == *s2){s1++;s2++;}if (*s2 == '\0'){return cur;}cur++;}}int main()
{char arr[] = "abbbcdef";char* p = "bbcq";const char* ret = my_strstr(arr, p);if (ret == NULL){printf("不存在\n");}else{printf("%s\n", ret);}return 0;
}
十一、strtok函数的使用
strtok(char *str, const char *sep)函数用于根据分隔符sep分割字符串str。第一次调用时,str为要分割的字符串;后续调用时,str应为NULL,以继续分割上次操作的字符串。
示例代码:使用strtok
#include <stdio.h>
#include <string.h>int main()
{char arr[] = "192.168.6.111";char *sep = ".";char *str = NULL;for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep)){printf("%s\n", str);}return 0;
}
十二、strerror函数的使用
strerror(int errnum)函数用于将错误码errnum对应的错误信息以字符串形式返回。错误码通常存储在errno变量中。
示例代码:使用strerror
#include <errno.h>int main()
{FILE* pf = fopen("data.txt", "r");if (pf == NULL){printf("打开文件失败,原因是:%s", strerror(errno));return 1;}else{printf("打开文件成功\n");fclose(pf);pf = NULL;}return 0;
}
#include <errno.h>
#include <string.h>
#include <stdio.h>int main()
{int i = 0;for (i = 0; i <= 10; i++){printf("%s\n", strerror(i));}return 0;
}
输出示例
No error
Operation not permitted
No such file or directory
No such process
Interrupted function call
Input/output error
No such device or address
Arg list too long
Exec format error
Bad file descriptor
No child processes
总结
本文详细介绍了C语言中常用的字符和字符串函数,包括它们的使用方法和模拟实现。通过这些函数,我们可以高效地处理字符和字符串,从而简化编程过程。希望本文能帮助你更好地理解和应用这些函数,提升你的C语言编程能力。如果你对这些函数还有其他疑问,欢迎在评论区留言讨论!