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 | 判断是否为字母a |
| 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;}文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
相关文章智能推荐
1
c语言内存函数
C/C++从source位置开始向后复制num个字节到destination指向的内存位置 不会在遇到'\0'时停下来 如果source和destination有重叠,复制结果是未定义的 适用于非重叠内存区域的拷贝
2
C++基础语法
C/C++std是C++标准库的命名空间,就像一个大文件夹 cout、endl等都放在这个"文件夹"里 using namespace std相当于说"我要用std文件夹里的所有东西" 不加这行的话,每次都要写std::cout,就像写"文件夹/文…
3
指针,引用与const的复杂关系
C/C++从右向左读: const在左边 : 指向的内容是const const在右边:指针本身是const 引用没有const:因为引用不能重新绑定 mutable是例外:可以在const函数中修改
4
多态
C/C++多态(polymorphism):即"多种形态",指同一接口表现出不同行为的能力。
5
结构体
C/C++结构体:一些值的集合,这些值称为成员变量 每个成员可以是不同类型变量
随机文章随机推荐

