目录
1. 字符分类函数
C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。 这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h
这些函数的使⽤⽅法⾮常类似,我们就讲解⼀个函数的事情,其他的⾮常类似:
int islower ( int c );
islower 是能够判断参数部分的c是否是⼩写字⺟的。 通过返回值来说明是否是⼩写字⺟,如果是⼩写字⺟就返回⾮0的整数,如果不是⼩写字⺟,则返回 0。
使⽤代码演⽰:写⼀个代码,讲字符串中的⼩写字⺟转⼤写,其他字符不变
#include <stdio.h>
#include <ctype.h>
int main()
{
int i = 0;
char str[] = "Test String.\n";
char c;
while (str[i])
{
c = str[i];
if (islower(c))
c -= 32;
putchar(c);
i++;
}
return 0;
}
2. 字符转换函数
C语⾔提供了2个字符转换函数:
上⾯的代码,我们将⼩写转⼤写,是-32完成的效果,有了转换函数,就可以直接使⽤ tolower 函 数。
#include <stdio.h>
#include <ctype.h>
int main()
{
int i = 0;
char str[] = "Test String.\n";
char c;
while (str[i])
{
c = str[i];
if (islower(c))
c = toupper(c);
putchar(c);
i++;
}
return 0;
}
3. strlen
size_t strlen ( const char * str );
用于计算字符串的长度(即字符个数)
函数接受一个参数 str
,是要计算长度的字符串的指针。
strlen
函数会扫描 str
字符串,直到遇到字符串结束符 \0
,然后返回字符串的长度,不包括结束符。
• 字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包含 '\0' )
• 参数指向的字符串必须要以 '\0' 结束。
• 注意函数的返回值为size_t,是⽆符号的( 易错 )
#include <stdio.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;
}
4. strcpy
char* strcpy(char * destination, const char * source );
用于将一个字符串复制到另一个字符串中
函数接受两个参数,dest
和 src
。dest
是目标字符串的指针,src
是源字符串的指针。
strcpy
函数会将 src
字符串的内容复制到 dest
字符串中,并返回 dest
字符串的指针。
• 源字符串必须以 '\0' 结束。
• 会将源字符串中的 '\0' 拷⻉到⽬标空间。
• ⽬标空间必须⾜够⼤,以确保能存放源字符串。
• ⽬标空间必须可变。
#include <stdio.h>
#include <string.h>
int main() {
char source[] = "Hello, World!";
char destination[20];
strcpy(destination, source);
printf("Source: %s\n", source);
printf("Destination: %s\n", destination);
return 0;
}
以上代码中,我们声明了 source
和 destination
字符数组。使用 strcpy
函数将 source
中的字符串复制到 destination
中。最后,我们打印出复制前后的字符串内容。
输出结果:
Source: Hello, World!
Destination: Hello, World!
5. strcat
char* strcat(char* dest, const char* src);
用于将一个字符串追加到另一个字符串的末尾
函数接受两个参数,dest
和 src
。dest
是目标字符串的指针,src
是要追加的源字符串的指针。
strcat
函数会将 src
字符串的内容追加到 dest
字符串的末尾,并返回 dest
字符串的指针。
注意:dest
字符串必须有足够的空间来容纳新的追加内容。
#include <stdio.h>
#include <string.h>
int main() {
char dest[20] = "Hello";
char src[] = ", World!";
strcat(dest, src);
printf("Destination: %s\n", dest);
return 0;
}
以上代码中,我们声明了 dest
和 src
字符数组。使用 strcat
函数将 src
字符串追加到 dest
字符串的末尾。最后,我们打印出追加后的字符串内容。
输出结果:
Destination: Hello, World!
6. strcmp
int strcmp(const char* str1, const char* str2);
用于比较两个字符串的大小关系
函数接受两个参数,str1
和 str2
,分别是要进行比较的两个字符串的指针。
strcmp
函数会按照字典顺序(ASCII码值的⼤⼩)比较两个字符串,并返回一个整数值来表示比较结果。返回值的含义如下:
- 如果
str1
小于str2
,则返回一个负数(通常是 -1)。 - 如果
str1
等于str2
,则返回 0。 - 如果
str1
大于str2
,则返回一个正数(通常是 1)。
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "apple";
char str2[] = "banana";
int result = strcmp(str1, str2);
if (result < 0) {
printf("%s is less than %s\n", str1, str2);
} else if (result == 0) {
printf("%s is equal to %s\n", str1, str2);
} else {
printf("%s is greater than %s\n", str1, str2);
}
return 0;
}
以上代码中,我们声明了 str1
和 str2
字符数组。使用 strcmp
函数比较了这两个字符串的大小关系,并根据比较结果打印相应的消息。
输出结果:
apple is less than banana
7. strncpy 函数的使⽤
char* strncpy(char* dest, const char* src, size_t n);
用于将一个字符串的一部分复制到另一个字符串中
函数接受三个参数,dest
、src
和 n
。dest
是目标字符串的指针,src
是源字符串的指针,n
是要复制的最大字符数。
strncpy
函数会将 src
字符串的最多前 n
个字符复制到 dest
字符串中。如果 src
的长度不足 n
,则会在复制完 src
的内容后,用空字符 \0
填充 dest
字符串的剩余部分,以达到 n
个字符的长度。
注意:如果 src
的长度小于 n
,则 dest
字符串可能不会以空字符结尾。
#include <stdio.h>
#include <string.h>
int main() {
char dest[10];
char src[] = "Hello, World!";
strncpy(dest, src, 9);
dest[9] = '\0';
printf("Destination: %s\n", dest);
return 0;
}
以上代码中,我们声明了 dest
和 src
字符数组。使用 strncpy
函数将 src
字符串的前 9 个字符复制到 dest
字符串中,并手动添加空字符 \0
来确保 dest
字符串以空字符结尾。最后,我们打印出复制后的字符串内容。
输出结果:
Destination: Hello, Wo
8. strncat 函数的使⽤
char* strncat(char* dest, const char* src, size_t n);
用于将一个字符串的一部分追加到另一个字符串的末尾
函数接受三个参数,dest
、src
和 n
。dest
是目标字符串的指针,src
是源字符串的指针,n
是要追加的最大字符数。
strncat
函数会将 src
字符串的最多前 n
个字符追加到 dest
字符串的末尾,并在追加完成后,用空字符 \0
结束 dest
字符串。
注意:如果 src
的长度小于 n
,则 dest
字符串可能不会以空字符结尾。
#include <stdio.h>
#include <string.h>
int main() {
char dest[20] = "Hello, ";
char src[] = "World!";
strncat(dest, src, 6);
printf("Concatenated string: %s\n", dest);
return 0;
}
以上代码中,我们声明了 dest
和 src
字符数组。使用 strncat
函数将 src
字符串的前 6 个字符追加到 dest
字符串的末尾。最后,我们打印出追加后的字符串内容。
输出结果:
Concatenated string: Hello, World
9. strncmp函数的使⽤
int strncmp(const char* str1, const char* str2, size_t n);
用于比较两个字符串的前几个字符是否相等
函数接受三个参数,str1
和 str2
分别是要进行比较的字符串的指针,n
是要比较的字符数。
strncmp
函数会比较 str1
和 str2
字符串的前 n
个字符。如果两个字符串在前 n
个字符上完全相同,则返回值为 0。如果两个字符串不相同,则返回值为它们在第一个不同字符处的 ASCII 码差值。如果 n
大于两个字符串的长度,或者两个字符串在前 n
个字符上完全相同但长度不相等,则返回值为它们的长度差值。
#include <stdio.h>
#include <string.h>
int main() {
const char* str1 = "Hello";
const char* str2 = "Help";
int result = strncmp(str1, str2, 3);
if (result == 0) {
printf("The first 3 characters are the same.\n");
} else if (result < 0) {
printf("The first 3 characters of str1 are smaller.\n");
} else {
printf("The first 3 characters of str1 are greater.\n");
}
return 0;
}
以上代码中,我们声明了 str1
和 str2
字符串指针。使用 strncmp
函数比较 str1
和 str2
字符串的前 3 个字符,并根据返回结果打印相应的消息。
输出结果:
The first 3 characters are the same.
10. strstr
char* strstr(const char* haystack, const char* needle);
用于在一个字符串中查找另一个子字符串的第一次出现位置
函数接受两个参数,haystack
和 needle
,分别是要被搜索的字符串和要搜索的子字符串。
strstr
函数会在 haystack
字符串中查找第一次出现的 needle
子字符串,并返回一个指向该位置的指针。如果找到了子字符串,返回的指针指向 haystack
中匹配的子字符串的第一个字符;如果未找到子字符串,则返回空指针。
#include <stdio.h>
#include <string.h>
int main() {
const char* haystack = "Hello, World!";
const char* needle = "World";
char* result = strstr(haystack, needle);
if (result != NULL) {
printf("Found at index: %ld\n", result - haystack);
} else {
printf("Not found\n");
}
return 0;
}
以上代码中,我们声明了 haystack
和 needle
字符串指针。使用 strstr
函数在 haystack
字符串中查找第一次出现的 needle
子字符串,并根据返回结果打印相应的消息。
输出结果:
Found at index: 7
11. strtok函数的使⽤
char* strtok(char* str, const char* delim);
用于将一个字符串按照指定的分隔符进行分割,并返回分割后的子字符串
函数接受两个参数,str
是要被分割的字符串的指针,delim
是分隔符字符串的指针。在第一次调用 strtok
函数时,需要将要被分割的字符串作为参数传入函数。在后续的调用中,只需要传入空指针即可继续分割原字符串。
strtok
函数会将被分割的字符串按照 delim
中的字符作为分隔符进行分割,并返回第一个子字符串的指针。在后续的调用中,函数会继续返回下一个子字符串的指针,直到全部分割完成。
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello,World!How are you?";
char* token;
token = strtok(str, ",! ");
while (token != NULL) {
printf("%s\n", token);
token = strtok(NULL, ",! ");
}
return 0;
}
以上代码中,我们声明了一个 str
字符数组,并使用 strtok
函数将其按照逗号、感叹号和空格进行分割。通过一个循环遍历所有分割后的子字符串,并将其打印出来。
输出结果:
Hello
World
How
are
you?
12. strerror函数的使⽤
char* strerror(int errnum);
用于根据给定的错误码返回对应的错误描述字符串
函数接受一个整数参数 errnum
,表示错误码。它会根据给定的错误码返回对应的错误描述字符串。
strerror
函数会查找系统定义的错误码表,并返回与 errnum
相对应的错误描述字符串。如果无法找到对应的错误描述,那么函数将返回一个通用的错误信息字符串。
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main() {
int errnum = EACCES;
char* errmsg = strerror(errnum);
printf("Error message for errno %d: %s\n", errnum, errmsg);
return 0;
}
以上代码中,我们使用 strerror
函数获取 EACCES
错误码(表示权限被拒绝)对应的错误描述字符串,并将其打印出来。
输出结果:
Error message for errno 13: Permission denied
需要注意的是,strerror
函数是线程不安全的,因为它使用了一个静态的字符串缓冲区来存储错误描述。如果在多线程环境下使用,可能会导致数据竞争和不可预测的结果。为了避免这个问题,可以使用 strerror_r
函数,它是一个线程安全的版本。
希望我的文章能对你有所帮助,感谢支持!!!