相信学习C语言的小伙伴们在面对各种各样的库函数时总是会感到眼花缭乱,由于我也是临近期中考试,稍微总结了一下最近常用的库函数,目前也是希望分享给大家。
1.转化类函数
提到转化类函数,c语言中其实主要就有两种:
分别是字符大小写转化函数以及字符串与数字间的转化函数
(1)字符大小写转化函数:
tolower,toupper
需要头文件<ctype.c>
int tolower(int c)
用于将一个字符转换为相应的小写字符,接受参数“int c”表示一个字符的ASCII值,并返回效应的小写字符的ASCII值,如果c不是大写字母,那么该函数返回原始字符的ASCII值。
#include <stdio.h>
#include <ctype.h>
int main() {
char str[] = "Hello World!";
int i = 0;
printf("转化前的字符串: %s\n", str);
while (str[i] != '\0') {
str[i] = tolower(str[i]);
i++;
}
printf("转化后的字符串: %s\n", str);
return 0;
}
前后的运行结果也是十分的显然。
分别是Hello World 与hello world大家试一下就可以了。
有大写向小写转化的函数,那么当然就会有小写向大写的转化函数。
int toupper(int c)
用于将小写字母转化为大写字母,其用法与tolower函数大致类似,此处就不过多介绍。
(2)字符串与数字间的转化函数
atoi,sscanf,sprintf
int atoi(const char *str)
需要头文件<stdlib.h>
这是将字符串转化为数字的函数
`atoi`函数会解析传入的字符串,跳过前导空格,直到遇到数字字符或正负符号为止,然后将后续的数字部分转换为整数。如果字符串无法转化成整形,或者字符串为空,则返回0。
#include <stdio.h>
#include <stdlib.h>
int main() {
char str[] = " 12345";
int num = atoi(str);
printf("The converted integer is: %d\n", num);
return 0;
}
此时会输出结果: The converted integer is: 12345。
#include <stdio.h>
#include <stdlib.h>
int main() {
char str[] = " -12345 ";
int num = atoi(str);
printf("The converted integer is: %d\n", num);
return 0;
}
输出结果:The converted integer is: -12345
但是,注意atoi函数仅仅会跳过前导空格,而无法处理数字中的出现的空格,当数字中出现空格是,atoi函数会将其作为非数字字符处理。
#include <stdio.h>
#include <stdlib.h>
int main() {
char str[] = " 123 45 ";
int num = atoi(str);
printf("The converted integer is: %d\n", num);
return 0;
}
输出结果: The converted integer is:123
int sscanf(const char *buffer,const char *format[,argument]...)
需要头文件<stdio.h>
大家第一眼看到这个函数的参数可能会感到十分的震惊,单数不要害怕,如果我将scanf的参数摆下来大家可能会看的更加清楚。
int scanf(const char *format[,,argument]...)
其实相对于scanf函数,sscanf也仅仅是多了个信息源:buffer,在scanf中,buffer信息源标准输入流(stdin)。
sscanf的基本使用方法是指定一个格式字符串(类似于 scanf()
),然后将要解析的字符串作为第一个参数传递给 sscanf()
,并且在后续参数中传递要存储数据的变量地址。
#include <stdio.h>
int main() {
char str[] = "Hello 123 World";
char word[20];
int num;
// 从字符串中解析一个字符串和一个整数
sscanf(str, "%s %d", word, &num);
printf("Word: %s\n", word);
printf("Number: %d\n", num);
return 0;
}
输出结果:Word: Hello
Number: 123
int sprintf(char *buffer,const char* format[,argument]...)
头文件<stdio.h>
sprintf与printf的作用类似,但是不是奖结果输出到标准输出流(stdout),而是将结果写入字符串buffer中。
#include <stdio.h>
int main() {
char buffer[50]; // 创建一个大小为50的字符数组,用于存储结果
int num = 123;
float f = 3.14;
char str[] = "Hello, world!";
// 使用 sprintf 将格式化的数据写入到 buffer 中
sprintf(buffer, "Integer: %d, Float: %.2f, String: %s", num, f, str);
// 打印 buffer 中的内容
printf("Formatted string: %s\n", buffer);
return 0;
}
输出结果:
Formatted string: Integer: 123, Float: 3.14, String: Hello, world!
注意:sscanf是将buffer中的数据按照格式写入不同类型的数组中,而sprintf是将不同格式的数组中的元素全部以字符串的形式读入buffer中。
2.检查类函数
这一类函数用法基本相同,都需要引用头文件<ctype.h>
iscntrl 任何控制字符
isspace 空白字符:空格' ',换页'\f',换行'\n',回车'\r',制表符'\t'或者垂直制表符'\v'
isdigit 十进制数字0-9
islower 小写字母a-z
isupper 大写字母A-Z
isalpha 字母a-z或A-Z
isalnum 字母或者数字,a-z,A-Z,0-9
ispunct 标点符号,任何不属于数字或者字母的图形字符(可打印)
isgraph 任何图形字符
isprint 任何可打印字符,包括图形字符和空白字符
#include <stdio.h>
#include <ctype.h>
int main() {
char test_char1 = '5';
char test_char2 = 'A';
if (isdigit(test_char1)) {
printf("%c 是一个数字字符\n", test_char1);
} else {
printf("%c 不是一个数字字符\n", test_char1);
}
if (isdigit(test_char2)) {
printf("%c 是一个数字字符\n", test_char2);
} else {
printf("%c 不是一个数字字符\n", test_char2);
}
return 0;
}
以isdigit为例,如果()中的内容是一个数字类的字符那么会返回一个非0整数,否则,返回0。
3.字符串操作函数
以下函数均需要头文件<string.h>
(1)长度不受限制的字符串操作函数
strcpy,strcat,strcmp,strstr,strchr,strtok
char *strcpy(char *des,const char* source)
将字符串source拷贝到des中(很明显des=source是个错误的写法,而strcpy(des, source)则是完成了该用法)
int main()
{
char arr[20]={0};
strcpy(arr,"hello");
return 0;
}
char* strcat(char* des,const char* source)
将字符串source中的内容追加到des的尾部
int main()
{
char arr1[20]="hello ";
char arr2[]="world";
strcat(arr1,arr2);//字符串追加,arr1=“hello world” 必须保证有足够空间来进行追加
return 0;
}
注意:以上两个函数都是des(目的地)在前,而source(源头)在后,不要记混。
char *strcmp(const char *str1,const char* str2)
对str1与str2中的数据的字典序进行比较(str1[1]与str2[1]进行比较,str1[2]与str2[2]进行比较,str1[3]与str2[3]进行比较……直到出现不相等或者全部比完为止)
当str1<str2时,返回一个小于0的值
当str1=str2时,返回0
当str1>str2时,返回大于0的值
可以记作strcmp(str1,str2)的返回值与(str1-str2)的符号相同
int main()
{
int ret=strcmp("aqqq","aaa");//ret>0
return 0;
}
const char *strchr(const char *str,const char ch)
从字符串str中查找字符ch是否存在,并返回指向该字符的指针。如果未找到该字符,则返回空指针(如果想要查找第二次出现的位置可以标记第一次出现的位置,从该位置向后进行查找即可,如果想查找全部的位置写一个for循环即可)。
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, World!";
char ch = 'W';
char *result;
result = strchr(str, ch);
if (result != NULL) {
printf("'%c' 在字符串中的第一次出现位置: %d\n", ch, result - str);
} else {
printf("'%c' 未在字符串中找到\n", ch);
}
return 0;
}
一个用上了for循环的事例
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "popopopopop";
char ch = 'o';
char *ptr = str;
char *ret=NULL;
int i=1;
for(ret=strchr(ptr,ch);ret!=NULL;ptr=ret+1)
{
printf("%c在str第%d出现的位置为%d",ch,i,ret-str);
i++;
}
return 0;
}
const char *strstr(const char *str1,const char *str2)
从str1中查找str2是否存在,如果存在,返回第一次出现的位置,如果不存在,返回空指针
(用法与strchr类似,不做过多解释)
char *strtok(char *str,const char *sep)
sep参数是个字符串,定义了用于分隔符的字符集合
str指定一个字符串,包含了0个或多个sep字符串中一个或者多个分隔符分割的标记
strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针 (即会把原字符串给改掉 )
strtok函数的第一个参数不为NULL,函数将找到str中的第一个标记,strtok函数将保留它(\0)在字符串其中的位置
strtok函数的第一个参数为NULL,函数将在同一个字符串中被保留的位置开始,查找下一个标记
注意:该函数常与for循环或者while循环进行结合。
看不懂?来个事例解释一下
int main() {
char str[] = "Hello, World! How are you?";
char sep[] = " ,!?";
char *token;
token = strtok(str, sep);
while (token != NULL) {
printf("%s\n", token);
token = strtok(NULL, sep);
}
return 0;
}
输出结果:Hello
World
How
are
you
通过运用strtok函数实现了对str字符串以sep为标记符进行分段,当第一次对strtok(str,sep)中str传参时,传入需要进行分段的字符串str,在后续中则传入NULL,不过此处的NULL并非是真的对空指针进行分割,而是不传入新的指针,使之从上一次分割后标记的位置开始继续以sep为标记符对str进行分割。
(2)规定长度的字符串操作函数
strncpy,strncat,strncmp
char *strncpy(char* dest,const char* source,size_t num)
num是几就从source中考几个字符到dest中 。
char* strncat(char* dest,const char* source,size_t num)
num是几就向dest的尾部追加几个source中的字符。
char* strncmp(const char* str1,const char* str2,size_t num)
比较str1与str2中的前num个字符。
由于用法与strcpy,strcat,strcmp基本相同,此处不必做过多的介绍