当前位置: 首页 > news >正文

C语言之字符串处理函数

文章目录

  • 1 字符串处理函数
    • 1.1 输入输出
      • 1.1.1 输出函数puts
      • 1.1.2 输入函数gets
    • 1.2 连接函数
      • 1.2.1 stract
      • 1.2.2 strncat
    • 1.3 复制
      • 1.3.1 复制strcpy
      • 1.3.2 复制strncpy
      • 1.3.3 复制memcpy
      • 1.3.4 指定复制memmove
      • 1.3.5 指定复制memset
      • 1.3.6 新建复制strdup
      • 1.3.7 字符串设定strset
    • 1.4 比较
      • 1.4.1 比较strcmp
      • 1.4.2 比较strncmp
      • 1.4.3 比较memcmp
    • 1.5 搜索
      • 1.5.1 搜索memchr
      • 1.5.2 搜索首次位置strchr
      • 1.5.3 逆匹配搜索strcspn
      • 1.5.4 查找第一个不属于字符集的下标strspn
      • 1.5.5 查找错误strerror
      • 1.5.6 查找第一个属于字符集位置strpbrk
      • 1.5.7 查找给定字符的最后一次匹配strrchr
      • 1.5.8 查找字符串首次出现位置strstr
      • 1.5.9 分隔符查找strtok
    • 1.6 排序&长度
      • 1.6.1 倒排strrev
      • 1.6.2 长度函数strlen
    • 1.7 转换大小写
      • 1.7.1 转小写strlwr
      • 1.7.2 转大写strupr
    • 1.8 转换其他数据类型
      • 1.8.1 转换浮点型atof
      • 1.8.2 转换整型atoi
      • 1.8.3 转换长整型
        • 1.8.3.1 atol
        • 1.8.3.2 strtol
        • 1.8.3.3 无符号长整型strtoul
      • 1.8.4 转换双精度strtod

1 字符串处理函数

1.1 输入输出

1.1.1 输出函数puts

函数puts将字符串的内容输出到终端,并将字符串中的 \0 转换成换行符 \n 。即输出字符串内容,并换行。例如:

char str[]="1234";
puts(str);
将输出:1234

1.1.2 输入函数gets

参数 str是字符串,它的功能是从终端输入—行字符到str中。其中输入时的回车符被转换成\0str不能是字符串常量。该函数调用将返回一个函数值,其值是str的起始地址。

1.2 连接函数

1.2.1 stract

函数原型:char strcat (char dest,char *src);
函数功能:将两个字符串连接合并成一个字符串,也就是把字符串src连接到字符串dest后面,连接后的结果放在字符串dest中
返回值:指向字符串dest的指针

参数 str1、str2 是字符串,它的功能是将str2连接在str1的后面。str1不能是字符串常量。函数调用返回一个函数值,函数值为str1的开始地址。正确使用该函数,要求str1必须足够大,以便能容纳str2的内容。注意,连接前,strl和str2都各有自\0。 连接后,strl中的\0在连接时被覆盖掉,而在新的字符串有效字符之后保留一个 \0 。例如:

char str1[100]="Beijing",str2[]="China";
strcat(str1,str2);
puts(str1);
将输出BeijingChina。
#include <string.h>
#include <stdio.h>
int main( )
{char dest[20]={" "};char *hello = "hello ", *space = " ", *world = "world";strcat(dest, hello);strcat(dest, space);strcat(dest, world);printf("%s\n", destination);getch();return 0;
}
运行结果是:hello world

注意:开始对字符数组dest初始化为空是必要的,对声明的变量进行初始化是一个很好的习惯,如果不对字符数组dest进行初始化程序会产生运行时的错误,有兴趣的读者可以试试未初始化程序的输出结果。

1.2.2 strncat

函数原型:char strncat (char dest, char *src, int n);
函数功能:将一个字符串的子串连接到另一个字符串末端,也就是把字符串src的前n个字符连接到字符串dest后面,连接后的结果放在字符串dest中
返回值:指向字符串dest的指针

#include <string.h>
#include <string.h>
#include <stdio.h>
int main(void)
{char dest[30]={""};char *favorite = "I love", *tabs = "\t\n", *language = "C++";strcnat(dest, favorite,6);strncat(dest, tabs,1);strncat(dest, language,1);printf("%s\n", dest);getch();return 0;
}
运行结果是:I love    C

注意:本例程中,字符串tabs中的内容比较新奇,它并不是我们一般的字符,而是两个转义说明符构成的特殊字符,C语言内部在处理过程中遇到转义说明符时会作特殊处理,本例中会将\t看做制表符,将\n看做换行符。

1.3 复制

1.3.1 复制strcpy

函数原型: char strcpy (char dest,char * src);
函数功能:实现字符串的拷贝工作,也就是把字符串src中的内容拷贝到字符串dest中,使两个字符串的内容相同。
返回值:指向字符串dest的指针

#include <stdio.h> 
#include <string.h> 
int main(void) { char dest[20] ={""}; char *src = "Hello World"; int result; strcpy(dest,src); printf("%s\n", dest); result=strcmp(dest,src); if(!result) printf("dest is equal to src"); else printf("dest is not equal to src");getch(); return 0; } 
运行结果是:Hello World dest is equal to src 

注意:本例程中,向字符数组中赋值时要保证字符数组中有足够的空间,虽然有时候即便空间不够也会打印出正确的结果,但随着程序的运行,不能保证超出下标范围的部分还能以正确的型式存在。

1.3.2 复制strncpy

在某些应用中,需要将一个字符串的前面一部分拷贝,其余部分不拷贝。调用函数strncpy可实现这个要求。
strncpy(str1,str2,n)的作用是将str2中的前n个字符拷贝到str1(附加\0)。其中n是整型表达式,指明欲拷贝的字符个数。如果str2中的字符个数不多于n,则该函数调用等价于strcpy(strl,str2)

函数原型: char strncpy (char dest,char * src, int n);
函数功能:实现字符串子串的拷贝工作,也就是把字符串src中的前n个字符拷贝到字符串dest中。
返回值:指向字符串dest的指针

#include <stdio.h>
#include <string.h>
int main(void)
{char dest[20]={""};char *src1="Hello World",*src2 ="Aloha";strncpy(dest,src1,5);strncpy(dest,src2,5);if(!strcmp(dest,src1))printf("dest is equal to src1");else if(!strcmp(dest,src2))printf("dest is equal to src2");elseprintf("dest is %s",dest);printf("%s\n", dest);getch();return 0;
}
运行结果是:Aloha
dest is equal to src2

1.3.3 复制memcpy

函数原型:void memcpy(void destin, void *source, unsigned n)
函数功能:从source所指的对象中复制n个字符到destin所指的对象中。但是,如果这种复制发生在重叠对象之间,其行为是不可预知的。

#include <stdio.h>
#include <string.h>
int main(void)
{char *s = "";char *d = "This is a test for memcpy function";char *ptr;printf("destination before memcpy: %s\n", d);ptr = memcpy(d, s, strlen(s));if (ptr)printf("destination after memcpy: %s\n", d);elseprintf("memcpy failed\n");return 0;
}
运行结果为:
destination before memcpy: This is a test for memcpy function
destination after memcpy:  test for memcpy function

注意memcpystrcpy的不同在于应用memcpy进行字符串的拷贝可以指定拷贝串的长度。另外memcpy的参数为void指针类型,因此它还可以对非字符型对象进行操作,而strcpy只适用于字符串的拷贝。
如果复制过程中发生在重叠对象之间,其行为是不可预知的。例如下面这个例子:

#include <string.h>
#include <stdio.h>
int main(void)
{char *d = "1234567890";char *p;p=d+3;printf(" %s\n", d);memcpy(p, d, 6);printf(" %s\n", d);return 0;
}运行结果为:
1234567890
1231231230

由于字符串p是字符串d的一个子串,在调用memcpy时,复制的字符串在d和p之间又重叠,因此该复制行为是不可预知的,结果也自然难以保证。
显然这不是期望得到的结果。

1.3.4 指定复制memmove

函数原型:void memmove(void destin, void *source, unsigned n)
函数功能:从source所指的对象中复制n个字符到destin所指的对象中。与memcpy不同的是,当对象重叠时,该函数仍能正确执行。

#include <stdio.h>
#include <string.h>
int main(void)
{char *s = "";char *d = "This is a test for memcpy function";char *ptr;printf("destination before memmove: %s\n", d);ptr = memmove(d, s, strlen(s));if (ptr)printf("destination after memmove:  %s\n", d);elseprintf("memcpy failed\n");return 0;
}
运行结果为:
destination before memmove: This is a test for memcpy function
destination after memmove:  test for memcpy function

注意: 与函数memcpy不同的是,当对象重叠时,该函数仍能正确执行。例如下面这个例子:

#include <string.h>
#include <stdio.h>
int main(void)
{char *d = "1234567890";char *p;p=d+3;printf(" %s\n", d);memmove(p, d, 6);printf(" %s\n", d);return 0;
}
运行结果为:1234567890
1231234560

显然这是期望得到的结果。 这是因为函数memmove的复制行为类似于先从source对象中复制n个字符到一个与source和destin都不重合的含n个字符的临时数组中作为缓冲,然后从临时数组中再复制n个字符destin所指的对象中。 就本段程序而言,memmove先将字符串“123456”复制到一个临时数组中,再将它复制到以p为首地址的字符串中。

1.3.5 指定复制memset

函数原型:void memset(void s, int c, unsigned n)
函数功能:把c复制到s所指向的对象的前n个字符的每一个字符中。
返回值:s的值

#include <string.h>
#include <stdio.h>
int main(void)
{char *str="AAAAAAAAAAAAAAAAAA";printf("The original string is:    %s\n",str);memset(str,'B',9);printf("The string after memset is:%s\n",str);
}
运行结果为:The original string is:    AAAAAAAAAAAAAAAAAA
The string after memset is:BBBBBBBBBAAAAAAAAA

1.3.6 新建复制strdup

函数原型:char strdup(char str);
函数功能:将字符串拷贝到新分配的空间位置,也就是将str拷贝到一块新分配的存储空间,其内部使用动态分配内存技术实现的,分配给字符串的空间来自于当前所用内存模式制定的堆。
返回值:返回指向含有该串拷贝的存储区

#include <stdio.h>
#include <string.h>
int main(void)
{char *src="This is the buffer text";char *dest;dest=strdup(src);if(!strcmp(src,dest))printf("Copy success\n%s\n",dest);elseprintf("Copy failure");free(dest);getch();return 0;
}
运行结果是:Copy success
This is the buffer text

注意:本例程中,初学者往往会忽视释放动态分配存储区的操作,虽然表面看起来似乎对程序没有什么影响,但实际上不对存储区进行回收会造成内存泄漏,在一些大程序会造成致命的后果。

1.3.7 字符串设定strset

函数原型:char strset(char str, char c);
函数功能:将字符串原有字符全部设定为指定字符,也就是将字符串str中的所有字符全部用字符c进行替换.
返回值:返回指向被替换字符串的指针

#include <stdio.h>
#include <string.h>
int main(void)
{char str[11]="0123456789";char symbol='a';printf("Before: %s\n",str);strset(str,symbol);printf("After: %s\n",str);getch();return 0;
}
运行结果是:0123456789
aaaaaaaaaa

1.4 比较

1.4.1 比较strcmp

函数原型:int strcmp (char str1,char str2);
函数功能:比较两个字符串的大小,也就是把字符串str1和字符串str2从首字符开始逐字符的进行比较,直到某个字符不相同或比较到最后一个字符为止,字符的比较为ASIC码的比较
返回值:若字符串str1大于字符串str2返回结果大于零,若字符串str1小于字符串str2返回结果小于零,若字符串str1等于字符串str2返回结果等于零

参数 str1、str2 是字符串,它的功能是比较两个字符串大小。对两个字符串自左至右逐个字符相比较(按字符的ASCII代码值的大小),直至出现不同的字符或遇到\0为止。如全部字符都相同,则认为相等,函数返回0值;若出现不相同的字符,则以这第一个不相同的字符比较结果为准。若str1的那个不相同字符小于str2的相应字符,函数返回一个负整数;反之,返回一个正整数。 注意,对字符串不允许施加相等==和不相等!=运算,必须用字符串比较函数对字符串作比较。
例如:
if(str1==str2) printf("Yes\n");是非法的,而只能用if(strcmp(str1,str2)==0) printf("Yes\n");

#include <string.h>
#include <stdio.h>
int main(void)
{char *str1 = "Canada", *str2 = "China", *str3 = "china";int result;result = strcmp(str1, str2);if (result < 0)printf("%s is less than %s", str1,str2);elseprintf("%s is not less than %s", str1,str2);printf("\n");result = strcmp(str2, str3);if (result < 0)printf("%s is less than %s", str2,str3);elseprintf("%s is not less than %s", str2,str3);getch();return 0;
}运行结果是:
Canada is less than China
China is less than china

注意:本例程中,字符串的比较结果为首个两个不等字符之间ASIC码的差值,如果我们将第一次比较的结果result输出,应该是’ a’的ASIC与码与’ h’的ASIC码的差值

1.4.2 比较strncmp

函数原型: int strncmp (char str1,char str2, int n);
函数功能:比较两个字符串子串的大小,也就是把字符串str1的前n个字符组成的子串和字符串str2的前n个字符组成的子串进行比较,从首字符开始逐字符的进行比较,直到某个字符不相同或比较到第n个字符为止。
返回值:若字符串str1前n个字符组成的子串大于字符串str2前n个字符组成的子串返回结果大于零,若字符串str1前n个字符组成的子串小于字符串str2前n个字符组成的子串返回结果小于零,若字符串str1前n个字符组成的子串等于字符串str2前n个字符组成的子串返回结果等于零

#include <string.h>
#include <string.h>
int main(void)
{char *str1="Hello World";char *str2="Hello C Programme";int result;result=strncmp(str1,str2,5);if(!result)printf("%s is identical to %s in the first 5 words",str1,str2);else if(result<0)printf("%s is less than %s in the first 5 words",str1,str2);elseprintf("%s is great than %s in the first 5 words",str1,str2);printf("\n");result=strncmp(str1,str2,10);if(!result)printf("%s is identical to %s in the first 10 words",str1,str2);else if(result<0)printf("%s is less than %s in the first 10 words",str1,str2);elseprintf("%s is great than %s in the first 10 words",str1,str2);getch();return 0;
}
运行结果是:Hello World is identical to Hello C Programme in the first 5 words
Hello World is great than Hello C Programme in the first 10 words

注意:本例程中,要注意子串比较的过程中子串的大小应不小于零且不超过字符串的长度,虽然子串的长短参数不会产生编译时的错误和最终结果的输出,但在比较前检查比较范围是一个很好的习惯。

1.4.3 比较memcmp

函数原型:void memcmp(char s1, char *s2, unsigned n)
函数功能:比较s1所指向的字符串与s2所指向的字符串的前n个字符。
返回值:根据s1所指向的对象的大于、等于、小于s2所指向的对象,函数

#include <stdio.h>
#include <string.h>
int main(void)
{char *str1="ABCDEF";char *str2="ABCDEf";int s1,s2;s1=memcmp(str1,str2,6);s2=memcmp(str1,str2,5);printf("The comparison of 6 character\n");if(s1>0)printf("%s>%s\n",str1,str2);elseif(s1<0)printf("%s<%s\n",str1,str2);elseprintf("%s=%s\n",str1,str2);printf("The comparison of 5 character\n");if(s2>0)printf("%s>%s\n",str1,str2);elseif(s2<0)printf("%s<%s\n",str1,str2);elseprintf("%s=%s\n",str1,str2);
}运行结果为:
The comparison of 6 character
ABCDEF<ABCDEf
The comparison of 5 character
ABCDEF=ABCDEf

注意: 由于字符串比较的方法是从左至右按照字符的ASCII码进行比较的,因此在比较6个字符时,字符串“ABCDEF”<“ABCDEf”(f的ASCII值大于F的ASCII值);而只比较5个字符时,字符串“ABCDEF”=“ABCDEf”。

1.5 搜索

1.5.1 搜索memchr

函数原型:void memchr(void s, char ch, unsigned n)
函数功能:在数组的前 n 个字节中搜索字符 ch
返回值:返回一个指针,它指向ch在s 中第一次出现的位置。如果在s的前n个字符中找不到匹配,返回NULL。

#include <string.h>
#include <stdio.h>
int main(void)
{char *str="I love China\n";char *p;p=memchr(str,'C',strlen(str));if(p)printf("%s",p);elseprintf("The character was not found\n") ;
}
本例程的运行结果为:
China

1.5.2 搜索首次位置strchr

函数原型:char strchr(char str, char c);
函数功能:在字符串中查找给定字符的第一次匹配,也就是在字符串str中查找字符c第一次出现的位置
返回值:第一次匹配位置的指针

#include <stdio.h>
#include <string.h>
int main(void)
{char str[15] ={""};char *ptr, c = 'r';strcpy(str, "Hello World");ptr = strchr(str, c);if (ptr)printf("The character %c is at position: %d\n", c, ptr-str);elseprintf("The character was not found\n");strcpy(str, "Aloha");if (ptr)printf("The character %c is at position: %d\n", c, ptr-str);elseprintf("The character was not found\n");getch();return 0;
}
运行结果是:
The character r is at position 8
The character r is at position 8

注意:本例程中,对字符串中字符匹配的返回值是指向匹配位置的指针,我们获取到该指针后,与数组的头指针做减法,也就是与数组变量名做减法,就可以获得我们得到的指针在数组中对应的下标。

1.5.3 逆匹配搜索strcspn

函数原型:int strcspn(char str1, char str2);
函数功能:在字符串中查找第一个属于字符集的下标,即从开始有多少个字符不属于字符集,也就是在字符串str1中查找第一个属于字符集str2中任何一个字符的下标,即字符串str1中从开始一直有多少个字符不属于字符集str2中的字符。
返回值:所找到的字符串中段的长度

#include <string.h>
#include <stdio.h>
int main(void)
{char *str1="tomato",*str2="carrot";char *str= "abc";int  result;result = strcspn(str1,str);if(result)printf("The first %d is congruent\n",result);elseprintf("No character is congruent\n");result = strcspn(str2,str);if(result)printf("The first %d is congruent\n",result);elseprintf("No character is congruent\n");getch();return 0;
}运行结果是:
The first 3 is congruent
No character is congruent

注意:本例程中,字符集逆匹配与字符集匹配两者的匹配方式截然相反,字符串匹配是当字符串中字符等于字符集中任意字符是匹配成功,字符串逆匹配是当字符串中字符不等于字符集中任意字符是匹配成功。

1.5.4 查找第一个不属于字符集的下标strspn

函数原型:int strspn(char str1, char str2);
函数功能:在字符串中查找第一个不属于字符集的下标,即从开始有多少个字符属于字符集,也就是在字符串str1中查找第一个不属于字符集str2中任何一个字符的下标,即字符串str1中从开始一直有多少个字符属于字符集str2中的字符。
返回值:所找到的字符串中段的长度

#include <string.h>
#include <stdio.h>
int main(void)
{char *str1="cabbage",*str2="potato";char *str= "abc";int  result;result = strspn(str1,str);if(result)printf("The first %d is congruent\n",result);elseprintf("No character is congruent");result = strspn(str2,str);if(result)printf("The first %d is congruent\n",result);elseprintf("No character is congruent");getch();return 0;
}
运行结果是:The first 5 is congruent
No character is congruent

1.5.5 查找错误strerror

函数原型:char *strerror(int errnum);
函数功能:获取程序出现错误的字符串信息,也就是根据错误代码errnum查找到具体的错误信息。

如下示例,循环只取了前十二种错误信息,实际的错误种类还有更多

#include <stdio.h>
#include <errno.h>
int main(void)
{char *error;int i;for(i=0;i<12;i++){error=strerror(i);printf("%s",error);}getch();return 0;
}运行结果是:Error 0
Invalid function number
No such file or directory
Path not found
Too many open files
Permission denied
Bad file number
Memory arena trashed
Not enough memory
Invalid memory block address
Invalid environment
Invalid format

1.5.6 查找第一个属于字符集位置strpbrk

函数原型:char strpbrk(char str1, char *str2);
函数功能:在字符串中查找第一个属于字符集的字符位置,也就是在字符串str1中查找第一个属于字符集str2中任意字符的位置。
返回值:返回第一个匹配字符的指针

#include <stdio.h>
#include <string.h>
int main(void)
{char *str1="There are 5 pigs in the hogpen";char *str2="0123456789";char *result;result = strpbrk(str1,str2);if(result)printf("%s\n",result++);elseprintf("There are no numbers any more");result = strpbrk(result,str2);if(result)printf("%s\n",result++);elseprintf("There are no numbers any more");getch();return 0;
}
运行结果是:5 pigs in the hogpen
There are no numbers any more

注意:本例程中,值得注意的是匹配成功时结果的输出。由于获得了匹配成功的字符的指针,因此我们可以利用该指针输出字符串的字串,利用自增操作符我们移动一个位置又可以对尚未匹配的子串继续进行下一次匹配。

1.5.7 查找给定字符的最后一次匹配strrchr

函数原型:char strrchr(char str, char c);
函数功能:在字符串中查找给定字符的最后一次匹配,也就是在字符串str中查找字符c最后一次出现的位置
返回值:最后一次匹配位置的指针

#include <stdio.h>
#include <string.h>
int main(void)
{char str[15]={""};char *ptr, c = 'o';strcpy(str, "Hello World");ptr = strchr(str, c);if (ptr)printf("The first character %c is at position: %d\n", c, ptr-str);elseprintf("The character was not found\n");ptr = strrchr(str, c);if (ptr)printf("The last character %c is at position: %d\n", c, ptr-str);elseprintf("The character was not found\n");getch();return 0;
}
运行结果是:The first character r is at position 4
The last character r is at position 7

注意:本例程中,如果字符串中只有一个’o’字符,那么无论调用哪种字符串中字符匹配函数都会返回相同的结果。

1.5.8 查找字符串首次出现位置strstr

函数原型:char strstr(char str1, char *str2);
函数功能:在字符串中查找另一个字符串首次出现的位置,也就是在字符串str1中查找第一次出现字符串str2的位置。
返回值:返回第一次匹配字符串的指针

#include <stdio.h>
#include <string.h>
int main(void)
{char *str1 = "Borland International",*str2 = "nation";char *result;result=strstr(str1, str2);if(result)printf("The substring is: %s\n", ptr);elseprintf("Not found the substring");getch();return 0;
}
运行结果是:
The substring is national

注意:本例程中,匹配成功时的返回结果并不是进行匹配的字符串,而是第一次匹配成功的字符串首字符的指针。

1.5.9 分隔符查找strtok

函数原型:char strtok(char str1, char *str2);
函数功能:在字符串中查找单词,这个单词始有第二个字符串中定义的分隔符分开,也就是在字符串str1中查找由字符串str2定义的分隔符,以分隔符为界,分隔出来的分隔符前面的所有字符组成一个单词,分离出第一个单词后将第一个参数置为空,可以继续分隔第二个单词。
返回值:返回分隔出的单词的指针

#include <stdio.h>
#include <string.h>
int main(void)
{char *str1="I am very\thappy,to,stduy\nC\nprogramme";char *str2=" ,\t\n";char *token;printf("%s\n\nTokens:\n",str1);token = strtok(str1,str2);while( token != NULL ){printf("%s\n",token);token = strtok(NULL,str2);}getch();return 0;
}运行结果是:I am very        happy,to,study
C
Programme
Token:
I
am
very
happy
to
study
C
Programme

注意:本例程中,一定要记住如果在第一次分隔出单词后想继续进行分隔操作,务必要将函数的第一个参数置为空。

1.6 排序&长度

1.6.1 倒排strrev

函数原型:char strrev(char str);
函数功能:将字符串进行倒转,也就是将字符串str中的第一个字符与最后一个字符交换,第二个字符与倒数第二个字符交换,以此类推。
返回值:返回倒转后字符串的指针

#include <stdio.h>
#include <string.h>
int main(void)
{char *str = "Able was I ere I saw Elba";printf("Before: %s\n",str);strrev(str);printf("After: %s\n",str);getch();return 0;
}
运行结果是:Able was I ere I saw Elba
ablE was I ere I saw elbA

注意:本例程中,字符数组中的初值并不是严格意义上的回文,将它倒转后会发现与原字符串并不是完全一样。

1.6.2 长度函数strlen

函数原型: int strlen (char *str);
函数功能:求字符串的长度,也就是求字符串str中有多少个字符
返回值:字符串str字符的个数

#include <stdio.h>
#include <string.h>
int main(void)
{char src1[3]={""},src2[10]={"Hello"};char *src3="Hello";printf("%d\n",strlen(src1));printf("%d\n",strlen(src2));printf("%d\n",strlen(src3));getch();return 0;
}
运行结果是:0
5
5

1.7 转换大小写

1.7.1 转小写strlwr

函数原型:char strlwr(char str,);
函数功能:将字符串原有大写字符全部转换为小写字符,也就是将字符串str中的所有字符变成小写。
返回值:返回指向被转换字符串的指针

函数strlwr(str)将字符串str中的大写字母转换成小写字母,其中str不能是字符串常量。 例0.24:任意输入一个英文书名,将书名中的小写字母全部转换成大写字母,其余字符不变,输出转换后的书名。程序代码如下:

#include <stdio.h>
#include <string.h>
int main()
{char str[100];int i;printf("Input the book name: ");gets(str);for(i=0; i<=strlen(str);i++){if(str[i]>='a'&&str[i]<='z')str[i]-=32;}puts(str);return 0; 
}

在上面的程序中,首先定义了一个字符数组str,用来存储英文书名,然后用gets函数得到输入的英文书名。在for循环中,用strlen函数得到输入的英文书名字符串的长度,然后把英文书名的小写字母转换成大写字母。最后用puts函数输出转换后的英文书名。

#include <stdio.h>
#include <string.h>
int main(void)
{char *s="You'll Never Walk Alone";printf("%s",strlwr(s));getch();return 0;
}

1.7.2 转大写strupr

函数原型:char strupr(char str);
函数功能:将字符串原有小写字符全部转换为大写字符,也就是将字符串str中的所有字符变成大写。
返回值:返回指向被转换字符串的指针

strupr(str)则将字符串str中的小写字母转换成大写字母,其中str不能是字符串常量。

#include <stdio.h>
#include <string.h>
int main(void)
{char *s=" You'll Never Walk Alone ";printf("%s",strlwr(s));getch();return 0;
}运行结果是:YOU’LL NEVER WALK ALONE

1.8 转换其他数据类型

1.8.1 转换浮点型atof

函数原型:float atof(const char *str);
函数功能:将字符串转换成浮点值,也就是将字符串str转换成浮点值然后获取转换后的结果。
返回值:返回转换后的浮点值

#include <stdio.h>
#include <stdlib.h>
int main(void)
{char *str="12345.67";float result;result=atof(str);printf("string=%s\nfloat =%f\n",str,result);getch();return 0;
}
运行结果:
string =12345.67
float=12345.669922

注意:本例程中,转换成浮点数的结果有些奇怪,它并不等于我们字符串中变量的值,而是存在一定的误差,虽然误差很小,但是可以看出误差是从原字符串中的最后一位开始的,这是由于在转换过程中函数内部在实现时采用的转换方式造成的,如果想避免这种误差,可以使用strtoX系列函数。

1.8.2 转换整型atoi

函数原型:int atoi(const char *str);
函数功能:将字符串转换成整数值,也就是将字符串str转换成整型值然后获取转换后的结果。
返回值:返回转换后的整型值

#include <stdio.h>
#include <stdlib.h>
int main(void)
{char *str="12345.67";int result;result=atoi(str);printf("string=%s\ninteger=%d\n",str,result);getch();return 0;
}运行结果是:
string =12345.67
integer=12345

1.8.3 转换长整型

1.8.3.1 atol

函数原型:long atol(const char *str);
函数功能:将字符串转换成长整数值,也就是将字符串str转换成长整型值然后获取转换后的结果。
返回值:返回转换后的长整型值

#include <stdio.h>
#include <stdlib.h>
int main(void)
{char *str="12345.67";long result;result=atol(str);printf("string=%s\nlong =%ld\n",str,result);getch();return 0;
}运行结果是:
string =12345.67
long=12345
1.8.3.2 strtol

函数原型:long strtol(char str, char *endptr, int base);
函数功能:将字符串转换为长整型值,也就是将字符串str转换为长整型值,其中进行转换字符串必须是长整型的字符表示格式,如果字符串中有非法的非数字字符,则第二个参数将负责获取该非法字符,即字符串指针endptr用于进行错误检测,转换在此非法字符处停止进行。
返回值:返回转换后的长整型结果

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{char str[20], *endptr;long result;while(1){printf("Input a long:");gets(str);result=strtod(str,&endptr);if(result!=-1)printf("The number is %ld\n",result);elsebreak;}getch();return 0;
}
运行结果是:Input a long: -15
The number is -15
Input a long: 1234.5678
The number is 1234
Input a long: 333333333333
The number is 2147483647
Input a long: -34abc
The number is -34
Input a long: abc
The number is 0
Input a float: -1

注意:将字符串中的小数转换为长整型时,程序会将小数点看作非法字符,从而停止转换继续进行,因此无论小数点后面的数是多少都会截断,而不是我们习惯上的四舍五入或者五舍六入。

1.8.3.3 无符号长整型strtoul

函数原型:unsigned long strtoul(char str, char *endptr, int base);
函数功能:将字符串转换为无符号长整型值,也就是将字符串str转换为无符号长整型值,其中进行转换字符串必须是无符号长整型的字符表示格式,如果字符串中有非法的非数字字符,则第二个参数将负责获取该非法字符,即字符串指针endptr用于进行错误检测,转换在此非法字符处停止进行。
返回值:返回转换后的无符号长整型结果

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{char str[20], *endptr;unsigned long result;while(1){printf("Input an unsigned long:");gets(str);result=strtoud(str,&endptr);if(result!=-1)printf("The number is %lu\n",result);elsebreak;}getch();return 0;
}运行结果是:Input a long: 100
The number is 100
Input a long: -36
The number is 0
Input a float: 1

注意:本例程中,输入负数的时候程序会将负号看作非法字符,从而停止转换继续进行,没有发生任何实际的转换。

1.8.4 转换双精度strtod

函数原型:double strtod(char str, char *endptr);
函数功能:将字符串转换非双精度值,也就是将字符串str转换为双精度值,其中进行转换字符串必须是双精度数的字符表示格式,如果字符串中有非法的非数字字符,则第二个参数将负责获取该非法字符,即字符串指针endptr用于进行错误检测,转换在此非法字符处停止进行。
返回值:返回转换后的双精度结果

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{char str[20], *endptr;double result;while(1){printf("Input a float:");gets(str);result=strtod(str,&endptr);if(result==-1)printf("The number is %lf\n",str,result);elsebreak;}getch();return 0;
}运行结果是:Input a float: 4.2
The number is 4.20000
Input a float: 79
The number is 79.00000
Input a float: 1.1111111111
The number is 1.111111
Input a float: 34.45abc
The number is 34.450000
Input a float:abc
The number is 0.000000
Input a float: -1

注意:本例程中,即便转换出现非法字符循环也不会停止,而只是通过第二个参数捕捉到了非法字符,可以编写程序对非法字符进行处理,本例中并没有这样做,循环只是以输入循环结束标志循环结束依据。

相关文章:

C语言之字符串处理函数

文章目录 1 字符串处理函数1.1 输入输出1.1.1 输出函数puts1.1.2 输入函数gets 1.2 连接函数1.2.1 stract1.2.2 strncat 1.3 复制1.3.1 复制strcpy1.3.2 复制strncpy1.3.3 复制memcpy1.3.4 指定复制memmove1.3.5 指定复制memset1.3.6 新建复制strdup1.3.7 字符串设定strset 1.4…...

昇思25天学习打卡营第4天|onereal

今天学习的内容是&#xff1a;ResNet50迁移学习 以下内容拷贝至教程&#xff0c;实话实话看不懂&#xff0c;迷迷糊糊都运行jupyter里的代码。走完程序&#xff0c;训练生成了一些图片。 ResNet50迁移学习 在实际应用场景中&#xff0c;由于训练数据集不足&#xff0c;所以很少…...

restTemplate使用总结

1、配置类 Configuration public class RestTemplateConfig() {Beanpublic RestTemplate restTemplate(ClientHttpRequestFactory factory) {return new RestTemplate(factory);}Beanpublic ClientHttpRequestFactory simpleClientHttpRequestFactory() {HttpComponentsClient…...

【云服务器介绍】选择指南 腾讯云 阿里云全配置对比 搭建web 个人开发 app 游戏服务器

​省流目录&#xff1a;适用于博客建站&#xff08;2-4G&#xff09;、个人开发/小型游戏[传奇/我的世界/饥荒]&#xff08;4-8G&#xff09;、数据分析/大型游戏[幻兽帕鲁/雾锁王国]服务器&#xff08;16-64G&#xff09; 1.京东云-618专属活动 官方采购季专属活动地址&#x…...

PostgreSQL 高级SQL查询(三)

1. JOIN 操作 1.1 内连接&#xff08;INNER JOIN&#xff09; 内连接用于返回两个表中存在匹配关系的记录。基本语法如下&#xff1a; SELECT columns FROM table1 INNER JOIN table2 ON table1.column table2.column;例如&#xff0c;从 users 表和 orders 表中检索所有用…...

麒麟系统安装Redis

一、背景 如前文&#xff08;《麒麟系统安装MySQL》&#xff09;所述。 二、下载Redis源码 官方未提供麒麟系统的Redis软件&#xff0c;须下载源码编译。 下载地址&#xff1a;https://redis.io/downloads 6.2.14版本源码下载地址&#xff1a;https://download.redis.io/re…...

Java-方法引用

方法引用概念 把已经有的方法拿过来用&#xff0c;当做函数式接口中抽象方法的方法体 前提条件 1、引用处必须是函数式接口 2、被引用的方法必须已经存在 3、被引用方法的形参和返回值 需要跟抽象方法保持一致 4、被引用方法的功能要满足当前需求 方法引用格式示例 方…...

华为---配置基本的访问控制列表(ACL)

11、访问控制列表&#xff08;ACL&#xff09; 11.1 配置基本的访问控制列表 11.1.1 原理概述 访问控制列表ACL(Access Control List)是由permit或deny语句组成的一系列有顺序的规则集合&#xff0c;这些规则根据数据包的源地址、目的地址、源端口、目的端口等信息来描述。A…...

Apple Intelligence,我们能得到什么?(上)

苹果公司WWDC 2024发布会&#xff0c;苹果AI成为最吸睛的焦点。不过&#xff0c;苹果的AI不是大家口中的AI&#xff0c;而是苹果独有的概念&#xff1a;Apple Intelligence&#xff0c;苹果智能。 所谓Apple Intelligence&#xff0c;被定义为iPhone、iPad和Mac的个人智能系统…...

【数据库中的存储桶】

存储桶是对象存储系统中的一个核心概念&#xff0c;起源于Amazon S3&#xff08;Simple Storage Service&#xff09;并被其他对象存储解决方案&#xff08;如MinIO、Google Cloud Storage等&#xff09;广泛采用。在传统的文件系统中&#xff0c;我们通常使用目录和子目录来组…...

多选项卡的shiny

下面是一个包含多个选项卡的 Shiny 应用程序示例代码。在这个例子中&#xff0c;我们创建了一个包含三个选项卡的 Shiny 应用程序&#xff0c;每个选项卡中都有不同的内容。 library(shiny)# Define UI ui <- fluidPage(titlePanel("多选项卡 Shiny 应用"),tabse…...

Python项目Django框架发布相关

1.Nginx配置 server { listen 80; server_name 域名地址;location / { uwsgi_pass 0.0.0.0:4563;// 运行地址include uwsgi_params;} location /static{ // 静态文件路径alias /www/wwwroot/djserverproject/static;}}server { listen 443; server_name 域名地址;ssl_certific…...

kettle使用手册 安装9.0版本 建议设置为英语

0.新建转换的常用组件 0. Generate rows 定义一个字符串 name value就是字符串的值 0.1 String operations 字段转大写 去空格 1. Json input 来源于一个json文件 1.json 或mq接收到的data内容是json字符串 2. Json output 定义Jsonbloc值为 data, 左侧Fieldname是数据库…...

golang string、byte[]以及rune的基本概念,用法以及区别

在 Go 语言中&#xff0c;string、byte[] 和 rune 是处理文本和字符的三种不同数据类型。它们有各自的用途和特点&#xff0c;下面将详细介绍它们的基本概念、用法以及区别。 1. string 基本概念 字符串类型&#xff1a;string 是 Go 语言中的一种基本类型&#xff0c;用于表…...

全国211大学名单及排名

序号 名称 省份 985 211 双一流 1 北京大学 北京 是 是 是 2 清华大学 北京 是 是 是 3 复旦大学 上海 是 是 是 4 上海交通大学 上海 是 是 是 5 浙江大学 浙江 是 是 是 6 国防科技大学 湖南 是 是 是 7 中国人民大学 北京 是 …...

ASR 语音识别相关

ASR 语音识别 ASR&#xff08;Automatic Speech Recognition&#xff0c;自动语音识别&#xff09;是一种能够将语音转换为文本的技术。这种技术使得计算机能够“听懂”我们说的话&#xff0c;并将它们记录下来。这项技术被广泛应用于日常生活中的各种场景&#xff0c;比如语音…...

kotlin require和assert 区别

在 Kotlin 中&#xff0c;require 和 assert 是两种用于验证条件的方法&#xff0c;主要区别在于它们的使用场景和触发机制。 require require 用于函数参数的验证。如果条件不满足&#xff0c;它会抛出 IllegalArgumentException 异常。这通常用于对公共 API 的输入参数进行…...

考研:数学一/二 和英语一/二 有什么区别

考研数学一/二 区别&#xff1a; 考试内容&#xff1a; 数学一&#xff1a;考查内容包括高等数学、线性代数、以及概率论与数理统计&#xff0c;覆盖的知识面较为全面&#xff0c;题目难度也相对较高。数学二&#xff1a;考试内容包含高等数学和线性代数&#xff0c;不包括概率…...

地铁中的CAN通信--地铁高效安全运转原理

目前地铁采用了自动化的技术来实现控制,有ATC(列车自动控制)系统可以实现列车自动驾驶、自动跟踪、自动调度;SCADA(供电系统管理自动化)系统可以实现主变电所、牵引变电所、降压变电所设备系统的遥控、遥信、遥测;BAS(环境监控系统)和FAS(火灾报警系统)可以实现车站…...

简化数据提取:Excel-Extractor 使用指南

前言 在当今数据驱动的世界中&#xff0c;从复杂的 Excel 文件中提取和分析数据是许多业务和研究工作的基本需求。为了简化这一过程&#xff0c;Excel-Extractor 项目应运而生。本文将为你介绍 Excel-Extractor 的功能和如何在你的项目中使用它。 什么是 Excel-Extractor&…...

用户中心项目全流程

企业做项目流程 需求分析 > 设计&#xff08;概要设计 、 详细设计&#xff09; > 技术选型 >初始化项目 / 引入需要的技术 > 写个小demo > 写代码 &#xff08;实现业务逻辑&#xff09; > 测试&#xff08;单元测试&#xff09;> 代码提交 / 代码评审 …...

达梦数据库的系统视图v$database

达梦数据库的系统视图v$database 基础信息 OS版本&#xff1a; Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本&#xff1a; DM Database Server 64 V8 DB Version: 0x7000c 03134284132-20240115-215128-20081在达梦数据库&#xff08;Dameng Database&#xf…...

Vue.js中的虚拟DOM

一.节点和状态 在我们平常对DOM操作的时候,之前在vue没有诞生之前,以命令式的方式对DOM进行操作,页面上的每一个元素都可以看做成一个节点状态。 二.剔除和渲染 框架都有自己渲染的方式,假设一个页面的状态,随着Ajax请求的放松,状态发生改变,有以下的两种方式供你选择&#…...

【设计模式之迭代器模式 -- C++】

迭代器模式 – 遍历集合&#xff0c;无需暴露 迭代器模式是一种设计模式&#xff0c;用于顺序访问集合对象的元素&#xff0c;而无需暴露其底层实现。迭代器模式分离了集合对象的遍历行为&#xff0c;使得访问元素时&#xff0c;可以不必了解集合对象的底层实现。 组成 迭代…...

Linux网络编程:套接字编程

1.Socket套接字编程 1.1.什么是socket套接字编程 Socket套接字编程 是一种基于网络层和传输层网络通信方式&#xff0c;它允许不同主机上的应用程序之间进行双向的数据通信。Socket是网络通信的基本构件&#xff0c;它提供了不同主机间的进程间通信端点的抽象。一个Socket就是…...

多电商账户为什么要用指纹浏览器?

随着电子商务的蓬勃发展&#xff0c;越来越多的商家选择开设多店来扩大经营规模。然而多店运营也带来了一系列的挑战&#xff0c;其中之一就是账号安全。 1. 了解反检测浏览器和代理服务器 在我们开始讨论如何有效地使用反检测浏览器之前&#xff0c;我们首先需要了解这两个工…...

用Rancher2.8.5部署K8s集群

参考&#xff1a;通过Rancher 2.7.5部署企业生产级K8s集群 新K8s集群的环境信息 Rancher1台&#xff0c;K8s集群6台&#xff08;1台rancher&#xff0c;3台master&#xff0c;4台node&#xff09;。 Name|lmage Name|IP Address|Flavor|Comment project-root-dev-rancher|Ro…...

未来已来,如何打造智慧养殖场?

近年来&#xff0c;国家出台了一系列扶持政策&#xff0c;以促进养殖行业高质量发展&#xff0c;推动行业转型升级。在国家政策和市场需求的双重驱动下&#xff0c;养殖行业正迎来前所未有的发展机遇。智慧养殖以其高效、智能和可持续的特点&#xff0c;正逐步取代传统养殖方式…...

代码随想录算法训练营第七天|454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和

打卡Day7 1.454.四数相加II2.383. 赎金信3.15. 三数之和4.18. 四数之和 1.454.四数相加II 题目链接&#xff1a;四数相加II 文档讲解&#xff1a; 代码随想录 class Solution {public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {int res 0;Map…...

Python和tkinter实现的字母记忆配对游戏

Python和tkinter实现的字母记忆配对游戏 因为这个小游戏用到了tkinter&#xff0c;先简要介绍一下它。tkinter是Python的标准GUI(图形用户界面)库&#xff0c;它提供了一种简单而强大的方式来创建图形界面应用程序。它提供了创建基本图形界面所需的所有工具&#xff0c;同时保…...

Leetcode Hot100之链表

1.相交链表 解题思路 快慢指针&#xff1a;分别求出两个链表的长度n1和n2&#xff0c;在长度较长的那个链表上&#xff0c;快指针先走n2 - n1&#xff0c;慢指针再出发&#xff0c;最后能相遇则链表相交 时间复杂度O(mn)&#xff0c;空间复杂度O(1)代码# Definition for singl…...

5.9k!一款清新好用的后台管理系统!【送源码】

今天给大家分享的开源项目是一个优雅清新后台管理系统——Soybean Admin。 简介 官方是这样介绍这个项目的&#xff1a; Soybean Admin 使用的是Vue3作为前端框架&#xff0c;TypeScript作为开发语言&#xff0c;同时还整合了NaiveUI组件库&#xff0c;使得系统具有高可用性和…...

Vue-cli搭建项目----基础版

什么是Vue-cli 全称:Vue command line interface 是一个用于快速搭建Vue.js项目的标准工具,他简化了Vue.js应用的创建和管理过程,通过命令工具帮助开发者快速生成,配置和管理Vue项目. 主要功能 同一的目录结构本地调试热部署单元测试集成打包上线 具体操作 第一步创建项目:…...

python之__call__函数介绍

Python 中的 __call__ 方法是一种特殊的方法,它允许对象像函数一样被调用。当你创建一个对象并使用括号 () 调用它时,Python 会自动调用这个对象的 __call__ 方法。 1. 基本用法 下面是一个简单的例子: class MyClass:def __init__(self, value):self.value valued…...

【AI】生成式AI服务器最低配置

【背景】 考虑数据安全&#xff0c;又想用AI赋能企业内部的日常工作&#xff0c;答案只有一个&#xff0c;本地部署。 UI采用open-web-ui&#xff0c;模型用Ollama管理&#xff0c;在局域网做成SAAS服务。要组一个服务器&#xff0c;提供部门内部最多30个的API并发。以下为反复…...

2.Android逆向协议-了解常用的逆向工具

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;微尘网校 上一个内容&#xff1a;1.Android逆向协议-环境搭建 常用的工具&#xff1a;AndroidKiller、jadx、JEB、IDA AndroidKiller…...

大数据------额外软件、插件及技术------Linux(完整知识点汇总)

Linxu 不同领域的主流操作系统 桌面操作系统 WindowsMAac OSLinux 服务器端操作系统 UNIX&#xff08;付费&#xff09;LinuxWindows Server&#xff08;付费&#xff09; 移动设备操作系统 Android&#xff08;基于Linux开源&#xff09;IOS&#xff08;不开源&#xff09; 嵌…...

iOS 其他应用的文件如何在分享中使用自己的应用打开

废话少说 一、第一步&#xff1a;先配置好plist文件 右击info.plist如下图文件打开 根据自己需要配置支持的文件类型&#xff0c;也可使用property List中配置&#xff0c;一样的 其他的文件可是参考文档&#xff1a;System-Declared Uniform Type Identifiers 可复制的代码&am…...

【编译原理必考大题】 推导构建语法树,写出语法树的短语,简单短语和句柄

写在最前 本文为编译原理重点考察大题之一&#xff0c;理论基础见专栏文章&#xff0c;0基础直接使用也可食用 文章目录 推导构造语法树1.语法树的概念2. 子树&#xff0c;短语&#xff0c;简单短语&#xff0c;句柄2.1 子树2.2 短语2.3 简单短语与句柄2.4 真题实战 推导构造语…...

redis服务介绍

redis 基础概念安装使用基础操作命令数据类型操作命令 管理和维护命令 基础概念 Remote Dictionary Server&#xff08;Redis&#xff09;远程字典服务器是完全开源免费的&#xff0c;用C语言编写的&#xff0c;遵守BSD开源协议&#xff0c;是一个高性能的&#xff08;key/val…...

nodepad 中换行符、tab替换

1 nodepad 主要符号 换行符: \r\n&#xff08;windows&#xff09; tab: \t 2 展示符号 3 相互替换 tip:需要点击扩展 参考&#xff1a; https://blog.csdn.net/lijing742180/article/details/85174564...

常见的字符串函数(包含头文件string.h)和字符函数(2)

八. strstr函数 1.strstr的定义 char *strstr( const char *str1, const char *str2 ); ->1. strstr查找子串(str2)在字符串(str2)中第一次出现的位置&#xff0c;记录并返回该位置的指针&#xff0c;如果找不到&#xff0c;则返回NULL ->2. str1&#xff1a;查找字符…...

Python | Leetcode Python题解之第187题重复的DNA序列

题目&#xff1a; 题解&#xff1a; L 10 bin {A: 0, C: 1, G: 2, T: 3}class Solution:def findRepeatedDnaSequences(self, s: str) -> List[str]:n len(s)if n < L:return []ans []x 0for ch in s[:L - 1]:x (x << 2) | bin[ch]cnt defaultdict(int)for…...

SpringCloud分布式微服务链路追踪方案:Skywalking

一、引言 随着微服务架构的广泛应用&#xff0c;系统的复杂性也随之增加。在这种复杂的系统中&#xff0c;应用通常由多个相互独立的服务组成&#xff0c;每个服务可能分布在不同的主机上。微服务架构虽然提高了系统的灵活性和可扩展性&#xff0c;但也带来了新的挑战&#xf…...

首次线下联合亮相!灵途科技携手AEye、ATI亮相2024 EAC 易贸汽车产业大会

6月22日&#xff0c;2024 EAC 易贸汽车产业大会在苏州国际博览中心圆满落幕&#xff0c;泛自动驾驶领域光电感知专家灵途科技携手自适应高性能激光雷达解决方案全球领导者AEye公司&#xff08;NASDAQ:LIDR&#xff09;及光电器件规模化量产巨头Accelight Technologies&#xff…...

一文入门CMake

我们前几篇文章已经入门了gcc和Makefile&#xff0c;现在可以来玩玩CMake了。 CMake和Makefile是差不多的&#xff0c;基本上是可以相互替换使用的。CMAke可以生成Makefile&#xff0c;所以本质上我们还是用的Makefile&#xff0c;只不过用了CMake就不用再写Makefile了&#x…...

【LeetCode面试经典150题】117. 填充每个节点的下一个右侧节点指针 II

一、题目 117. 填充每个节点的下一个右侧节点指针 II - 力扣&#xff08;LeetCode&#xff09; 给定一个二叉树&#xff1a; struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针&#xff0c;让这个指针指向其下一个右侧节点。如果找不到下一个…...

RTDETR更换优化器——Lion

RTDETR更换Lion优化器 论文&#xff1a;https://arxiv.org/abs/2302.06675 代码&#xff1a;https://github.com/google/automl/blob/master/lion/lion_pytorch.py 简介&#xff1a; Lion优化器是一种基于梯度的优化算法&#xff0c;旨在提高梯度下降法在深度学习中的优化效果…...

Spring Boot中最佳实践:数据源配置详解

Spring Boot中最佳实践&#xff1a;数据源配置详解 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨在Spring Boot中如何进行最佳实践的数据源…...

第1章 物联网模式简介---独特要求和体系结构原则

物联网用例的独特要求 物联网用例往往在功耗、带宽、分析等方面具有非常独特的要求。此外&#xff0c;物联网实施的固有复杂性&#xff08;一端的现场设备在计算上受到挑战&#xff0c;另一端的云容量几乎无限&#xff09;迫使架构师做出艰难的架构决策和实施选择。可用实现技…...