索引
- 一 . 字符操作函数
- 1. 字符分类函数
- 2. 字符转换函数
- 二 . 字符串操作函数
- 长度不受限制的字符串操作函数
- 1. strcpy函数的使用和模拟实现
- 2. strcat函数的使用和模拟实现
- 3. strcmp函数的使用和模拟实现
- 长度受限制的字符串操作函数
- 1. strncpy函数的使用
- 2. strncat函数的使用
- 3. strncmp函数的使用
- 其它常用字符串操作函数
- 1. strlen函数的使用和模拟实现
- 2. strstr函数的使用和模拟实现
- 3. strtok函数的使用
- 4. strerror函数的使用
- perror函数
- 三 . 总结
正文开始
一 . 字符操作函数
1. 字符分类函数
c语言中有一系列的函数是专门做字符分类的, 也就是一个字符是属于什么类型的字符的, 这些函数的使用都需要包含一个头文件是 ctype.h
函数如下:
这些函数的使用方法非常类似 , 我们就列举一个函数 , 其它非常的类似:
int islower ( int c );
islower 是能够判断参数部分的 c 是否是小写字母的。
通过返回值来说明是否是小写字母,如果是小写字母就返回非0的整数,如果不是小写字母,则返回
0。
写一个代码, 将字符串中的小写字母转为大写, 其他字符不变
#include<stdio.h>
#include<ctype.h>
int main()
{
char str[] = "TEst StrinG.\n";
int i = 0;
while (str[i])
{
if (islower(str[i]))//当然这里也可以不用判断,直接转换,只不过代码运行效率不高
{
str[i] = str[i] - 32;
}
i++;
}
printf("%s\n", str);
return 0;
}
2. 字符转换函数
c语言提供了2个字符转换函数:
int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写
int toupper ( int c ); //将参数传进去的⼩写字⺟转⼤写
上面的代码,我们将小写转大写,是-32完成的效果,有了转换函数,就可以直接使用 tolower 函数。
#include<stdio.h>
#include<ctype.h>
int main()
{
char str[] = "TEst StrinG.\n";
int i = 0;
while (str[i])
{
if (islower(str[i]))
{
str[i] = toupper(str[i]);
}
i++;
}
printf("%s\n", str);
return 0;
}
二 . 字符串操作函数
长度不受限制的字符串操作函数
1. strcpy函数的使用和模拟实现
函数介绍:
char* strcpy(char * destination, const char * source );
• 源字符串必须以 '\0' 结束。
• 会将源字符串中的 '\0' 拷⻉到⽬标空间。
• ⽬标空间必须⾜够⼤,以确保能存放源字符串。
• ⽬标空间必须可修改。
• 学会模拟实现
strcpy函数的模拟实现:
char* my_strcpy(char* str1, char* str2)//把str2中的内容拷贝到str1中
{
assert(str1 != NULL);
assert(str2 != NULL);
char* s = str1;
while (*str2 != '\0') {
*str1 = *str2;
str1++;
str2++;
}
*str1 = *str2;
return s;
}
//优化版本
char* my_strcpy(char* str1, const char* str2)
{
assert(str1 != NULL);
assert(str2 != NULL);
char* s = str1;
while (*str1++ = *str2++)
;
return s;
}
2. strcat函数的使用和模拟实现
函数介绍:
char *strcat(char *dest, const char*src);
• 源字符串必须以 '\0' 结束。
• ⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。
• ⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
• ⽬标空间必须可修改。
strcat函数的模拟实现
char* my_strcat(char* str1,const char* str2)//把str2中的数据拼接到str1
{
assert(str1 && str2);
char* s = str1;
while (*str1 != '\0')
str1++;
while (*str1++ = *str2++)
;
return s;
}
int main()
{
char str[20] = "abcdefg";
char* str2 = "hijklmn";
char* ret = my_strcat(str,str2);
printf("%s\n", ret);
return 0;
}
3. strcmp函数的使用和模拟实现
函数介绍:
int strcmp (const char * str1, const char * str2);
◦ 第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字
◦ 第⼀个字符串等于第⼆个字符串,则返回0
◦ 第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字
◦ 那么如何判断两个字符串? ⽐较两个字符串中对应位置上字符ASCII码值的⼤⼩
strcmp函数的模拟实现
int my_strcmp(const char *p1,const char *p2)
{
assert(p1 != NULL);
assert(p2 != NULL);
while (*p1 == *p2)
{
p1++;
p2++;
if (*p1 == '\0')
return 0;
}
if (*p1 > *p2)
return 1;
else return -1;
}
int main()
{
int ret = 0;
char* p1 = "abcdefg";
char* p2 = "abcdq";
ret = my_strcmp(p1, p2);
printf("%d\n", ret);
return 0;
}
长度受限制的字符串操作函数
1. strncpy函数的使用
函数介绍:
char * strncpy ( char * destination, const char * source, size_t num );
• 拷⻉num个字符从源字符串到⽬标空间。
• 如果源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边追加0,直到num个。
//strncpy :拷贝num个字符从源字符串拷贝到目标空间,不拷贝\0,要拷贝多少字符就拷贝多
//少字符,源字符串不够就在目标字符
//串之后追加'\0',直到num个,返回str1目标字符串的地址
int main()
{
char str1[10] = { 0 };
char* str2 = "1234567890";
strncpy(str1, str2, 5);
printf("%s\n", str1);
return 0;
}
运行结果:
2. strncat函数的使用
函数介绍:
char * strncat ( char * destination, const char * source, size_t num );
//strncat 字符串拼接,将源字符串的前num个字符追加到目标字符串结尾, 再追加一个'\0',
//如果源字符串指向的
//字符串长度小于num的时候, 只会将字符串中到'\0'的内容追加到destination指向的字符
//串末尾,返回目标字符串str1的地址
int main()
{
char str1[10] = "abcf";
char str2[10] = "12345";
strncat(str1, str2, 3);
printf("%s\n", str1);
}
3. strncmp函数的使用
函数介绍:
int strncmp ( const char * str1, const char * str2, size_t num );
⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀
样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0.
其它常用字符串操作函数
1. strlen函数的使用和模拟实现
函数介绍:
size_t strlen ( const char * str );
• 字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包
含 '\0' )。
• 参数指向的字符串必须要以 '\0' 结束。
• 注意函数的返回值为size_t,是⽆符号的( 易错 )
• strlen的使⽤需要包含头⽂件
• 学会strlen函数的模拟实现
#include <stdio.h>
#include <string.h>
int main()
{
const char* str1 = "abcdef";
const char* str2 = "bbb";
if (strlen(str2) - strlen(str1) > 0)
{
printf("str2>str1\n");
}
else
{
printf("srt1>str2\n");
}
return 0;
}
代码结果:
strlen函数的模拟实现:
#include<stdio.h>
#include<assert.h>
//模拟实现strlen 1(计数器版本)
size_t my_strlen1(const char* p)
{
assert(p);
int count = 0;//计数器
while (*p != '\0')
{
p++;
count++;
}
return count;
}
//模拟实现strlen 2(函数递归版本)
size_t my_strlen2(const char* p)
{
assert(p);
if (*p == '\0')
return 0;
else
return 1 + my_strlen2(p + 1);
}
//模拟实现strlen 3(指针-指针版本)
size_t my_strlen3(const char* p)
{
assert(p);
char* s = p;
while(*s != '\0')
s++;
return s - p;
}
int main()
{
char* str = "abcdefg";
int ret1 = my_strlen1(str);
int ret2 = my_strlen2(str);
int ret3 = my_strlen3(str);
printf("%d\n", ret1);
printf("%d\n", ret2);
printf("%d\n", ret3);
return 0;
}
2. strstr函数的使用和模拟实现
函数介绍:
char * strstr ( const char * str1, const char * str2);
//函数返回str2在str1中第一次出现的位置
//字符串中的比较匹配不包含\0,以\0作为结束标志
#include <stdio.h>
#include <string.h>
int main()
{
char str[] = "This is a simple string";
char* pch;
pch = strstr(str, "simple");
strncpy(pch, "sample", 6);
printf("%s\n", str);
return 0;
}
strstr函数的模拟实现
char* my_strstr(const char* p1,const char* p2)
{
const char* s1 = NULL;
const char* s2 = NULL;
const char* cur = p1;
if (p2 == NULL)
{
return p1;
}
while (*cur) {
s1 = cur;
s2 = p2;
while (*s1 == *s2 && *s1 != '\0' && *s2 != '\0')
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return cur;
}
cur++;
}
return NULL;
}
int main()
{
char* p1 = "abcdefg";
char* p2 = "cde";
char *ret = my_strstr(p1, p2);
printf("%s\n", ret);
return 0;
}
3. strtok函数的使用
函数介绍:
char * strtok ( char * str, const char * sep);
//strtok 函数的使用,字符串分割
//char* strtok(char* str,const char* sep);
//sep指向了一个字符串,定义了分隔符的集合
//第一个参数指定一个字符串, 它包含了多个或者0个由sep字符串中一个或者多个分隔符分割的标记
//strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针,并且保存这个标记结束的位置
//(注:strtok函数会改变被操作的字符串,所以在使用的时候strtok函数切分的字符串一般都是临时拷贝的内容并且可被修改)
//strtok函数的第一个参数不为NULL,函数将找到str中的第一个标记,返回这个标记,并且保存结束位置
//第一个参数为NULL,函数将在同一字符串中被保存的位置开始查找下一个标记
//如果字符串中不存在更多标记,则返回NULL指针
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;
}
4. strerror函数的使用
函数介绍:
char * strerror ( int errnum );
strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。
在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头⽂件中说明
的,C语⾔程序启动的时候就会使⽤⼀个全局的变量errno来记录程序的当前错误码,只不过程序启动
的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会将对应
的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是
有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。
#include <errno.h>
#include <string.h>
#include <stdio.h>
//我们打印⼀下0~10这些错误码对应的信息
int main()
{
int i = 0;
for (i = 0; i <= 10; i++) {
printf("%s\n", strerror(i));
}
return 0;
}
在vs下运行结果如下:
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
实际运用举例:
int main()
{
FILE* pFile;
pFile = fopen("text,txt", "r");
if (pFile == NULL)
printf("Error opening file text.txt: %s\n", strerror(errno));
return 0;
}
运行结果:
perror函数
函数介绍:
perror函数直接将错误信息打印出来, perror函数打印完参数部分的字符串后,再打印⼀个冒号和⼀个空格,再打印错误信息。
int main()
{
FILE* pFile;
pFile = fopen("text,txt", "r");
if (pFile == NULL)
perror("Error opening file text.txt");
return 0;
}
运行结果:
三 . 总结
字符函数和字符串函数是编程中常用的函数,能够帮助我们处理和操作文本数据,提高程序的灵活性和效率。在实际编程中,灵活运用字符函数和字符串函数可以简化代码逻辑,提高代码的可读性和可维护性.
如果觉得此文章有用的话记得 点赞 收藏 , 如有错误 ,恳请指正 感谢各位读者 !