对于数据结构中可能会常用的函数的小总结

相信学习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基本相同,此处不必做过多的介绍

 

  • 30
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值