c语言字符与字符串函数

859 字
4 分钟
c语言字符与字符串函数

字符分类函数#

函数功能描述
iscntrl判断是否为控制字符
isspace判断是否为空白字符(空格‘ ’,换页‘\f’,换行‘\n’,回车’\r’,制表’\t’,垂直制表符’\v’)
isdigit判断是否为十进制数字‘0’~‘9’
isxdigit判断是否为十六进制数字(0-9,a-f,A-F)
islower判断是否为小写字母a~z
isupper判断是否为大写字母A~Z
isalpha判断是否为字母az或AZ
isalnum判断是否为字母或数字
ispunct判断是否为标点符号
isgraph判断是否为任何图形字符
isprint判断是否为任何打印字符

strlen - 字符串长度#

size_t strlen(const char *str);
  • 计算’\0’之前的字符个数
  • 返回类型为size_t(无符号整型)
  • 字符串必须以’\0’结束

模拟实现#

// 方式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;
else
return 1 + my_strlen(str + 1);
}
// 方式3:指针相减
int my_strlen(char *s) {
assert(s);
char *p = s;
while(*p != '\0')
p++;
return p - s;
}

strcpy - 字符串拷贝#

char* strcpy(char* destination, const char* source);
  • 源字符串必须以’\0’结束
  • 会将源字符串的’\0’拷贝到目标空间
  • 目标空间必须足够大且可修改

模拟实现#

char* my_strcpy(char *dest, const char* src) {
char *ret = dest;
assert(dest != NULL);
assert(src != NULL);
while((*dest++ = *src++)) {
;
}
return ret;
}

strcat - 字符串追加#

char* strcat(char* destination, const char* source);
  • 源字符串必须以’\0’结束
  • 目标字符串必须有’\0’
  • 目标空间必须足够大且可修改
  • 不能自己追加自己

模拟实现#

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 - 字符串比较#

int strcmp(const char* str1, const char* str2);
  • str1 > str2:返回 >0 的数字
  • str1 = str2:返回 0
  • str1 < str2:返回 <0 的数字

模拟实现#

int my_strcmp(const char *str1, const char *str2) {
int ret = 0;
assert(str1 != NULL);
assert(str2 != NULL);
while(*str1 == *str2) {
if(*str1 == '\0')
return 0;
str1++;
str2++;
}
return *str1 - *str2;
}

strncpy - 长度受限的字符串拷贝#

char* strncpy(char* destination, const char* source, size_t num);
  • 拷贝num个字符到目标空间
  • 如果源字符串长度小于num,则用’\0’填充剩余部分

strncat - 长度受限的字符串追加#

char* strncat(char* destination, const char* source, size_t num);

 strncmp - 长度受限的字符串比较#

int strncmp(const char* str1, const char* str2, size_t num);
  • 只比较前num个字符
  • 比较规则同strcmp

strstr - 查找子串#

char* strstr(const char* str1, const char* str2);
  • 返回str2在str1中第一次出现的位置,如果没找到返回NULL

模拟实现#

char* strstr(const char *str1, const char *str2) {
char *cp = (char *)str1;
char *s1, *s2;
if(!*str2)
return ((char *)str1);
while(*cp) {
s1 = cp;
s2 = (char*)str2;
while(*s1 && *s2 && !(*s1 - *s2))
s1++, s2++;
if(!*s2)
return cp;
cp++;
}
return NULL;
}

strtok - 字符串分割#

char* strtok(char* str, const char* sep);
  • sep参数定义分隔符集合
  • 第一次调用传入字符串地址,后续调用传入NULL
  • 会修改原字符串,用’\0’替换分隔符

代码示例#

#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 - 错误信息描述#

char* strerror(int errnum);
  •  返回错误码对应的错误信息字符串

代码示例#

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main() {
FILE *pFile;
pFile = fopen("unexist.ent", "r");
if(pFile == NULL) {
printf("Error opening file: %s\n", strerror(errno));
// 或者使用perror
perror("Error opening file");
}
return 0;
}

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Profile Image of the Author
HandlerOne
おかえり
公告
本站已整理 138 篇技术笔记,并按 8 条主线排成学习路线(141 站);站内搜索与桌宠对话均已上线。
分类
标签
最新动态
站点统计
文章
138
分类
12
标签
42
总字数
597,044
站点信息
构建平台
腾讯云 · Nginx
博客版本
v6.16.8
文章目录