【C语言】字符函数与字符串函数
一、前言
在C语言中学到的int、double等类型我相信大家理解与运用起来都相当的不错,但是我也在学校中发现许多的同学对于字符与字符串的了解还是不太够的,可以说用起来还是有一些别扭,有时候自己对字符数组操作起来还是有很多的错误,这也是需要提升的,当然在C语言的库中也提供了一些关于字符、字符串的操作函数,这可以大大的帮助我们对字符进行管理
二、字符函数
C语言 ctype.h 库中有着许多的字符函数,下面我们挑选一些来学习
1. 字符分类函数
我们都知道许多的字符都有一个ASCII码值,我们可以根据ASCII码值找到这个符号或者对这个符号进行修改、判断这个符号属性,如:大写字母、小写字母、数字等
#include <stdio.h>
int main() {
char ch_Input = 0;
scanf("%c", &ch_Input);
if (ch_Input >= 97 && ch_Input <= 122) {
printf("小写字母\n");
}
return 0;
}
如上我们通过了ASCII码值比较可以判断是否是一个小写字母,但是这样写很麻烦,所有我们可以直接调用ctype.h库中的字符分类函数来判断一个字符的类型,下面我们列举一下字符分类函数
函数名 | 作用 |
---|---|
iscntr l | 任何控制字符 |
isspace | 空白字符:空格’',换页“\f” 、换行“\n”、回车“\r” 、制表符“\t”、垂直制表符“\v” |
isdigit | 十进制数字 ‘1’ ~ ‘9’ 的字符 |
isxdigit | 十六进制数字:包括所以十进制数字、小写字母’a’ ~ ‘f’、大写字母’A’ ~ ‘F’ |
islower | 小写字母’a’ ~ ‘z’ |
isupper | 大写字母’A’ ~ ‘Z’ |
isalpha | 字母(‘a’ ~ ‘z’ 或 ‘A’ ~ ‘Z’) |
isalnum | 字母或数字(‘a’ ~ ‘z’ 或 ‘A’ ~ ‘Z’ 或 ‘1’ ~ ‘9’) |
ispunct | 标点符号(任何不属于数字或字母的可打印图形) |
isgraph | 任何图形符号 |
isprint | 可打印字符,包括图形字符和空白符 |
#include <stdio.h>
#include <ctype.h>
int main() {
char ch_Input = 0;
scanf("%c", &ch_Input);
if (isalpha(ch_Input)) {
printf("字母!\n");
}
if (islower(ch_Input)) {
printf("小写字母!\n");
}
return 0;
}
其他字符函数的使用方式大同小异,这里就不一一展示了
2. 字符替换函数
#include <stdio.h>
int main() {
char ch_a = 'a';
char ch_A = ch_a - 32;
printf("%c\n", ch_A);
return 0;
}
如上,我们可以通过操作ASCII码值对ch_a的ASCII值进行运算得到A字符的ASCII码值,实现大小写之间的转换,同样的我们也有字符替换函数实现这一功能
函数名 | 作用 |
---|---|
tolower | 大写转小写 |
toupper | 小写转大写 |
tolower 与 toupper 的形参与返回值都是整型
#include <stdio.h>
#include <ctype.h>
int main() {
char arr[] = "Hello World!";
char* tmp_ch = arr;
while (*tmp_ch) {
*tmp_ch = toupper(*tmp_ch);
tmp_ch++;
}
printf("%s\n", arr);
return 0;
}
上面是把字符串中的小写字母转换为大写字母的代码,同时我们也可以看出,toupper函数会检查传入的数值是否是小写字母,不然不会进行转换
三、字符串函数
上面所说的字符函数是对单个字符进行操作,但是字符串函数则是对字符串也就是字符数组进行操作的,比如获取字符串长度,拼接字符串,分割字符串等等,而字符串函数位于string.h函数中
1. strlen函数(求字符串长度)
我们知道在C语言中使用字符数组来储存一个字符串,但是我们如果需要知道我们要去遍历一遍这一个数组,才有可能得到字符串的长度,如下:
#include <stdio.h>
int main() {
char arr[] = "Hello World!";
int i = 0;
while (arr[i]) {
i++;
}
printf("长度为%d\n", i);
return 0;
}
这里我们使用i对数组进行了遍历,得到了数组的长度,但是这样我们写的代码时十分的多的,所以我们可以使用strlen函数
#include <stdio.h>
#include <string.h>
int main() {
char arr[] = "Hello World!";
printf("字符串长度为:%zd\n", strlen(arr));
return 0;
}
注:
strlen函数遍历数组的结束标志为’\0’,若是字符串中没有’\0’则strlen函数不会停止计数,直到寻找到’\0’
2. strcpy函数(字符串拷贝)
strcpy函数可以将一个字符串拷贝到另一个字符串,前提是目的字符串的长度必须是足够的,不然拷贝会出现问题!
#include <stdio.h>
#include <string.h>
int main() {
char arr1[] = "HelloWorld!";
char arr2[15] = { 0 };
strcpy(arr2, arr1);
printf("%s\n", arr2);
return 0;
}
我们可以看到字符串已经拷贝完成
strcpy会将 \0 一起拷贝过去吗?
通过代码调试,我们可以发现strcpy在拷贝函数时会将 \0 也拷贝过去
strcpy的注意事项:
- 源字符串必须以’\0’ 结束
- 会将源字符串中的’\0’ 拷贝到目标空间
- 目标空间必须足够大,以确保能存放源字符串
- 目标空间必须可修改
3. strcat函数(字符串追加)
关于strcat函数使用的几个要点:
- 源字符串必须以’\0’ 结束
- 目标字符串中也得有\0 ,否则没办法知道追加从哪里开始
- 目标空间必须有足够的大,能容纳下源字符串的内容
- 目标空间必须可修改
源字符串就是要追加的内容,而目标字符串就是要进行尾部追加的字符串,strcat函数需要寻找到目标字符串的尾部也就是\0才能进行追加
#include <stdio.h>
#include <string.h>
int main() {
char arr1[13] = "Hello";
char arr2[8] = " World!";
printf("追加前:%s\n", arr1);
strcat(arr1, arr2);
printf("追加后:%s\n", arr1);
return 0;
}
4. strcmp函数(字符串大小比较)
字符串的大小比较并不是一整个整体的所占空间的大小比较,而是字符串会把两个字符串的对位字母比较,直到他们不相同
#include <stdio.h>
#include <string.h>
int main() {
char arr1[] = "HelloWorld!";
char arr2[] = "HalloWorld!";
if (strcmp(arr1, arr2) > 0) {
printf("arr1大\n");
}
return 0;
}
strcmp函数使用细节:
- 第一个字符串大于第二个字符串,则返回大于0的数字
- 第一个字符串等于第二个字符串,则返回0
- 第一个字符串小于第二个字符串,则返回小于0的数字
- strcmp函数大小比较依据是ASCII码值
5. strstr函数(寻找子字符串)
strstr函数用于寻找字符串函中是是否有特定的子字符串
char *strstr(const char *haystack, const char *needle);
- haystack:需要被搜索的主字符串(目标字符串)。
- needle:需要在主字符串中查找的子字符串。
返回值
- 如果在 haystack 中找到了 needle,则返回指向 haystack 中首次出现 needle 的位置的指针
- 如果未找到 needle,则返回空指针 NULL
#include <stdio.h>
#include <string.h>
int main() {
char arr[] = "Hello World!";
char Find[] = "Hello";
if (strstr(arr, Find)) {
printf("找到了!\n");
}
return 0;
}
四、End
对于常用的字符串就介绍到这里了,谢谢大家的阅读,希望对大家有所帮助!