本文目录
关于一些字符串函数的模拟实现,欢迎浏览文章C语言——一些字符串函数的模拟实现
一、字符函数
1.1 字符分类函数
C语言中有一系列的函数是专门做字符分类的,也就是一个字符是属于什么类型的字符的。这些函数的使用都需要包含一个头文件是<ctype.h>
常见的字符分类函数介绍
函数 | 如果他的参数符合下列条件就返回真 |
---|---|
iscntrl | 任何控制字符 |
isspace | 空白字符:空格‘ ’,换页‘\f,换行’\n’,回车‘\r’,制表符’\t’或者垂直制表符’\v’ |
isdigit | 十进制数字0~9 |
isxdigit | 十六进制数字,包括所有十进制数字,小写字母a~ f,大写字母A~ F |
islower | 小写字母a~z |
isupper | 大写字母A~Z |
isalpha | 字母a~ z和字母A~ Z |
isalnum | 字母或者数字,a~ z, A~ Z,0~9 |
ispunct | 标点符号,任何可打印的,不属于数字或字母的图形字符 |
isgraph | 任何图形字符 |
isprint | 任何可打印字符,包括图形字符和空白字符 |
应用举例
这些函数的使用方法非常类似,我们用 iscntrl 举例,其他的非常类似:
#include <stdio.h>
#include <ctype.h>
int main ()
{
int i=0;
char str[]="first line \n second line \n";
while (!iscntrl(str[i]))
{
putchar (str[i]);
i++;
}
return 0;
}
- 在C语言中,一个"!“符号表示逻辑非操作。当它后面跟着一个布尔表达式时,它将其取反。例如,如果表达式的结果为true,则”!"操作符将其转换为false,反之亦然。
- iscntrl 函数遇到任何控制字符的结果返回为真。(\n是一个控制字符)
上面代码的意思是,遍历输出字符串数组str[],遇到控制字符停止输出
输出结果为:
first line
1.2 字符转换函数
函数介绍
C语言提供了2个字符转换函数:
函数名 | 函数作用 |
---|---|
tolower | 将传入参数中的小写字母转为大写字母 |
toupper | 将传入参数中的大写字母转为小写字母 |
如果不使用库函数,我们将小写字母转大写字母,是小写字母进行-32得到的结果;大写转小写就是+32的结果。但是有了库函数,就可以直接使用库函数,方便快捷高效。
toupper 函数举例
void toUpperCase(char* str)
{
for (int i = 0; str[i] != '\0'; i++)
{
str[i] = toupper(str[i]);
}
}
int main()
{
char str[] = "Hello, world!";
printf("原字符: %s\n", str);
toUpperCase(str);
printf("转换后: %s\n", str);
return 0;
}
输出结果如下:
二、字符串函数
使用字符串函数要注意包含<string.h>头文件
关于一些字符串函数的模拟实现,欢迎浏览文章C语言——一些字符串函数的模拟实现
2.1 常用的字符串函数介绍
函数 | 函数作用 |
---|---|
strlen(a) | 用于计算字符串a的长度的函数,返回值为size_t类型的数字,头文件<string.h> |
strcpy(a,b) | 用于复制源字符串b, 到目标字符串a, 连 \0 字符一起拷贝,返回值为字符串a首元素的地址,头文件<string.h> |
strcat(a,b) | 将源字符串 b 的内容连接到目标字符串 a 的末尾,并在结果字符串的末尾添加结束符\0。返回值为字符串a首元素的地址,头文件<string.h> |
strcmp(a,b) | 比较a和b两个字符串,如果两个字符串完全相同,函数返回0;如果第一个参数str1中的字符串在字典顺序上位于第二个参数str2中的字符串之前,函数返回一个负整数。如果str1中的字符串在字典顺序上位于str2中的字符串之后,函数返回一个正整数。 |
strncpy(str1,str2,n) | 用于复制源字符串str2的前n个字符到目标字符串str1中,返回值为字符串str1首元素的地址。头文件<string.h> |
strncat(str1,str2,n) | 用于将源字符串str2的前n个字符追加到目标字符串str1的末尾,返回值为字符串str1首元素的地址。头文件<string.h> |
strncmp(str1,str2,n) | 函数按照字典顺序逐个比较两个字符串的前n个字符,直到遇到不匹配的字符或到达字符串的末尾。如果两个字符串的前n个字符完全相同,函数返回0。如果第一个参数str1中的字符串在前n个字符的字典顺序上位于第二个参数str2中的字符串之前,函数返回一个负整数。如果str1中的字符串在前n个字符的字典顺序上位于str2中的字符串之后,函数返回一个正整数。头文件<string.h> |
strstr(str1,str2) | 是在str1字符串中查找str2字符串的第一次出现。这个函数返回的是指向str1中第一次出现str2的位置的指针。如果str2没有在str1中出现过,那么函数将返回NULL。头文件<string.h> |
strtok(str,delim) | 用于将一个字符串分割成一系列子字符串。函数会将str按照delim中的字符进行分割,并返回指向第一个子字符串的指针。每次调用strtok函数都会将指针移动到下一个子字符串,直到没有更多的子字符串为止。(在分割字符串时,strtok函数会忽略掉字符串中的前导和尾随空格。如果分隔符字符串为NULL,则默认使用空格作为分隔符。)头文件<string.h> |
2.2 应用举例
① strlen
函数原型如下:
#include <string.h>
size_t strlen(const char *str);
这个函数接受一个指向字符串的指针作为参数,并返回该字符串的长度,不包括字符串末尾的空字符(‘\0’)。
strlen函数使用指针来遍历字符串中的每个字符,直到遇到空字符为止,它计算遍历过的字符数并返回结果。
以下是一个使用strlen函数的示例:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, world!";
printf("Length of string: %zu\n", strlen(str));
return 0;
}
在这个示例中,strlen函数计算字符串str的长度并使用printf函数输出结果。注意,我们使用了%zu格式说明符来输出strlen函数的返回值,因为它的返回类型是size_t。
输出结果为:
② strcpy
函数原型如下:
#include <string.h>
char *strcpy(char *dest, const char *src);
dest是目标字符串的指针,src是源字符串的指针。
strcpy函数将源字符串复制到目标字符串中,包括终止符\0。它返回指向目标字符串的指针。
以下是一个使用strcpy函数的示例:
#include <stdio.h>
#include <string.h>
int main() {
char src[30] = "Hello, world!";
char dest[30];
strcpy(dest, src);
printf("Source string: %s\n", src);
printf("Destination string: %s\n", dest);
return 0;
}
在这个示例中,strcpy函数将src中的字符串复制到dest中,然后通过printf函数输出两个字符串。
输出结果如下:
③ strcat
函数原型如下:
#include <string.h>
char *strcat(char *dest, const char *src);
其中,dest是目标字符串的指针,src是要连接的源字符串的指针。
strcat函数将源字符串追加到目标字符串的末尾,并在结果字符串的末尾添加一个终止符\0。它返回指向目标字符串的指针。
以下是一个使用strcat函数的示例:
#include <stdio.h>
#include <string.h>
int main() {
char dest[30] = "Hello, ";
char src[30] = "world!";
strcat(dest, src);
printf("Result string: %s\n", dest);
return 0;
}
在这个示例中,strcat函数将src中的字符串追加到dest的末尾,然后通过printf函数输出结果字符串。
输出结果如下:
④ strcmp
函数原型如下:
#include <string.h>
int strcmp(const char *str1, const char *str2);
其中,str1和str2是两个要进行比较的字符串的指针。
strcmp函数按字典顺序比较两个字符串,并返回它们的差值。如果两个字符串完全相同,则返回0;如果第一个字符串比第二个字符串小,则返回一个负数;如果第一个字符串比第二个字符串大,则返回一个正数。
以下是一个使用strcmp函数的示例:
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "Hello";
char str2[] = "hello";
int result = strcmp(str1, str2);
if (result == 0) {
printf("Strings are equal.\n");
} else if (result < 0) {
printf("String 1 is less than string 2.\n");
} else {
printf("String 1 is greater than string 2.\n");
}
return 0;
}
在这个示例中,strcmp函数比较了str1和str2两个字符串,并根据比较结果输出相应的消息。
输出结果为:
⑤ strncpy
strncpy函数的原型:
char *strncpy(char *dest, const char *src, size_t n);
下面是一个使用strncpy函数的示例:
#include <stdio.h>
#include <string.h>
int main() {
char dest[10] = "Hello";
const char src[] = " World";
strncpy(dest, src, 5);
printf("%s\n", dest); // 输出:Hello W
return 0;
}
在这个示例中,我们有一个目标字符串"Hello"和一个源字符串" World"。我们使用strncpy函数将源字符串的前5个字符复制到目标字符串中,结果是"Hello W"。注意,因为目标数组只有10个空间,所以我们只复制了前5个字符,而不是整个源字符串。同时,因为我们没有为目标数组预留空间来添加空字符,所以最后的输出并没有自动添加空字符。
⑥ strncat
该函数的原型定义:
char *strncat(char *dest, const char *src, size_t n);
下面是一个使用strncat函数的示例:
#include <stdio.h>
#include <string.h>
int main() {
char dest[10] = "Hello";
const char src[] = " World";
strncat(dest, src, 4);
printf("%s\n", dest); // 输出:Hello World
return 0;
}
在这个示例中,我们有一个目标字符串"Hello"和一个源字符串" World"。我们使用strncat函数将源字符串的前4个字符追加到目标字符串的末尾,结果是"Hello World"。
⑦ strncmp
strncmp函数的原型定义:
int strncmp(const char *str1, const char *str2, size_t n);
下面是一个使用strncmp函数的示例:
#include <stdio.h>
#include <string.h>
int main() {
const char str1[] = "Hello";
const char str2[] = "Hell";
int result = strncmp(str1, str2, 4);
if (result < 0) {
printf("%s is less than %s\n", str1, str2);
} else if (result > 0) {
printf("%s is greater than %s\n", str1, str2);
} else {
printf("%s is equal to %s\n", str1, str2);
}
return 0;
}
输出结果为:
⑧ strstr
strstr函数的原型是:
const char *strstr(const char *haystack, const char *needle);
以下是一个使用strstr函数的例子:
#include <stdio.h>
#include <string.h>
int main() {
const char *haystack = "Hello, world!";
const char *needle = "world";
const char *result = strstr(haystack, needle);
if (result) {
printf("'%s' found in '%s' at position: %ld\n", needle, haystack, result - haystack);
} else {
printf("'%s' not found in '%s'\n", needle, haystack);
}
return 0;
}
这段代码会输出:“‘world’ found in ‘Hello, world!’ at position: 7”,因为“world”在“Hello, world!”中第一次出现的位置是从字符串的第七个字符开始的。
⑨ strtok
strtok函数的原型是:
char *strtok(char *str, const char *delim);
以下是一个使用strtok函数的例子:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, World! How are you?";
const char delim[] = " ,!";
char *token;
token = strtok(str, delim);
while (token != NULL) {
printf("%s\n", token);
token = strtok(NULL, delim);
}
return 0;
}
这段代码会将字符串"Hello, World! How are you?"分割成多个子字符串,并输出每个子字符串。输出的结果将是:
Hello
World
How
are
you?
关于一些字符串函数的模拟实现,欢迎浏览文章C语言——一些字符串函数的模拟实现