Unix/Linux环境C编程入门教程(30) 字符串操作那些事儿

  1. 函数介绍

rindex(查找字符串中最后一个出现的指定字符)


相关函数


index,memchr,strchr,strrchr


表头文件


#include<string.h>


定义函数


char * rindex( const char *s,int c);


函数说明


rindex()用来找出参数s字符串中最后一个出现的参数c地址,然后将该字符出现的地址返回。字符串结束字符(NULL)也视为字符串一部分。


返回值


如果找到指定的字符则返回该字符所在的地址,否则返回0。


范例


#include <string.h>
mian()
{
char *s ="0123456789012345678901234567890";
char *p;
p=rindex(s,‘5‘);
printf("%s\n",p);
}


执行


567890


 


strcasecmp(忽略大小写比较字符串)


相关函数


bcmp,memcmp,strcmp,strcoll,strncmp


表头文件


#include<string.h>


定义函数


int strcasecmp (const char *s1, const char *s2);


函数说明


strcasecmp()用来比较参数s1和s2字符串,比较时会自动忽略大小写的差异。


返回值


若参数s1和s2字符串相同则返回0。s1长度大于s2长度则返回大于0 的值,s1 长度若小于s2 长度则返回小于0的值。


范例


#include <string.h>
main()
{
char *a="aBcDeF";
char *b="AbCdEf";
if(!strcasecmp(a,b))
printf("%s=%s\n",a,b);
}


执行


aBcDeF=AbCdEf


 


strcat(连接两字符串)


相关函数


bcopy,memccpy,memcpy,strcpy,strncpy


表头文件


#include <string.h>


定义函数


char *strcat (char *dest,const char *src);


函数说明


strcat()会将参数src字符串拷贝到参数dest所指的字符串尾。第一个参数dest要有足够的空间来容纳要拷贝的字符串。


返回值


返回参数dest的字符串起始地址


范例


#include <string.h.>
main()
{
char a[30]="string(1)";
char b[]="string(2)";
printf("before strcat() : %s\n",a);
printf("after strcat() : %s\n",strcat(a,b));
}


执行


before strcat () : string(1)
after strcat () : string(1)string(2)


 


strchr(查找字符串中第一个出现的指定字符)


相关函数


index,memchr,rinex,strbrk,strsep,strspn,strstr,strtok


表头文件


#include<string.h>


定义函数


char * strchr (const char *s,int c);


函数说明


strchr()用来找出参数s字符串中第一个出现的参数c地址,然后将该字符出现的地址返回。


返回值


如果找到指定的字符则返回该字符所在地址,否则返回0。


范例


#include<string.h>
main()
{
char *s=0123456789012345678901234567890";
char *p;
p=strchr(s,‘5‘);
printf("%s\n",p);
}


执行


5.68E+25


 


strcmp(比较字符串)


相关函数


bcmp,memcmp,strcasecmp,strncasecmp,strcoll


表头文件


#include<string.h>


定义函数


int strcmp(const char *s1,const char *s2);


函数说明


strcmp()用来比较参数s1和s2字符串。字符串大小的比较是以ASCII 码表上的顺序来决定,此顺序亦为字符的值。strcmp()首先将s1第一个字符值减去s2第一个字符值,若差值为0则再继续比较下个字符,若差值不为0则将差值返回。例如字符串"Ac"和"ba"比较则会返回字符"A"(65)和‘b‘(98)的差值(-33)。


返回值


若参数s1和s2字符串相同则返回0。s1若大于s2则返回大于0的值。s1若小于s2则返回小于0 的值。


范例


#include<string.h>
main()
{
char *a="aBcDeF";
char *b="AbCdEf";
char *c="aacdef";
char *d="aBcDeF";
printf("strcmp(a,b) : %d\n",strcmp(a,b));
printf("strcmp(a,c) : %d\n",strcmp(a,c));
printf("strcmp(a,d) : %d\n",strcmp(a,d));
}


执行


strcmp(a,b) : 32
strcmp(a,c) :-31
strcmp(a,d) : 0


 


strcoll(采用目前区域的字符排列次序来比较字符串)


相关函数


strcmp,bcmp,memcmp,strcasecmp,strncasecmp


表头文件


#include<string.h>


定义函数


int strcoll( const char *s1, const char *s2);


函数说明


strcoll()会依环境变量LC_COLLATE所指定的文字排列次序来比较s1和s2 字符串。


返回值


若参数s1和s2字符串相同则返回0。s1若大于s2则返回大于0的值。s1若小于s2则返回小于0 的值。


附加说明


若LC_COLLATE为"POSIX"或"C",则strcoll()与strcmp()作用完全相同。


范例


参考strcmp()。


 


strcpy(拷贝字符串)


相关函数


bcopy,memcpy,memccpy,memmove


表头文件


#include<string.h>


定义函数


char *strcpy(char *dest,const char *src);


函数说明


strcpy()会将参数src字符串拷贝至参数dest所指的地址。


返回值


返回参数dest的字符串起始地址。


附加说明


如果参数dest所指的内存空间不够大,可能会造成缓冲溢出(buffer Overflow)的错误情况,在编写程序时请特别留意,或者用strncpy()来取代。


范例


#include<string.h>
main()
{
char a[30]="string(1)";
char b[]="string(2)";
printf("before strcpy() :%s\n",a);
printf("after strcpy() :%s\n",strcpy(a,b));
}


执行


before strcpy() :string(1)
after strcpy() :string(2)


 


strcspn(返回字符串中连续不含指定字符串内容的字符数)


相关函数


strspn


表头文件


#inclued<string.h>


定义函数


size_t strcspn ( const char *s,const char * reject);


函数说明


strcspn()从参数s字符串的开头计算连续的字符,而这些字符都完全不在参数reject 所指的字符串中。简单地说,若strcspn()返回的数值为n,则代表字符串s开头连续有n个字符都不含字符串reject内的字符。


返回值


返回字符串s开头连续不含字符串reject内的字符数目。


范例


#include <string.h>
main()
{
char *str="Linux was first developed for 386/486-based pcs.";
printf("%d\n",strcspn(str," "));
printf("%d\n",strcspn(str,"/-"));
printf("%d\n",strcspn(str,"1234567890"));
}


执行


5 /*只计算到" "的出现,所以返回"Linux"的长度*/
33 /*计算到出现"/"或"-",所以返回到"6"的长度*/
30 /* 计算到出现数字字符为止,所以返回"3"出现前的长度*/


 


strdup(复制字符串)


相关函数


calloc,malloc,realloc,free


表头文件


#include<string.h>


定义函数


char * strdup( const char *s);


函数说明


strdup()会先用maolloc()配置与参数s字符串相同的空间大小,然后将参数s字符串的内容复制到该内存地址,然后把该地址返回。该地址最后可以利用free()来释放。


返回值


返回一字符串指针,该指针指向复制后的新字符串地址。若返回NULL表示内存不足。


范例


#include<string.h>
main()
{
char a[]="strdup";
char *b;
b=strdup(a);
printf("b[ ]=\"%s\"\n",b);
}


执行


b[ ]="strdup"


 


strlen(返回字符串长度)


相关函数


表头文件


#include<string.h>


定义函数


size_t strlen (const char *s);


函数说明


strlen()用来计算指定的字符串s的长度,不包括结束字符"\0"。


返回值


返回字符串s的字符数。


范例


/*取得字符串str的长度*/
#include<string.h>
main()
{
char *str = "12345678";
printf("str length = %d\n", strlen(str));
}


执行


str length = 8


 


strncasecmp(忽略大小写比较字符串)


相关函数


bcmp,memcmp,strcmp,strcoll,strncmp


表头文件


#include<string.h>


定义函数


int strncasecmp(const char *s1,const char *s2,size_t n);


函数说明


strncasecmp()用来比较参数s1和s2字符串前n个字符,比较时会自动忽略大小写的差异。


返回值


若参数s1和s2 字符串相同则返回0。s1 若大于s2则返回大于0的值,s1若小于s2则返回小于0 的值。


范例


#include<string.h>
main()
{
char *a="aBcDeF";
char *b="AbCdEf";
if(!strncasecmp(a,b))
printf("%s =%s\n",a,b);
}


执行


aBcDef=AbCdEf


 


strncat(连接两字符串)


相关函数


bcopy,memccpy,memecpy,strcpy,strncpy


表头文件


#inclue <string.h>


定义函数


char * strncat(char *dest,const char *src,size_t n);


函数说明


strncat()会将参数src字符串拷贝n个字符到参数dest所指的字符串尾。第一个参数dest要有足够的空间来容纳要拷贝的字符串。


返回值


返回参数dest的字符串起始地址。


范例


#include <string.h>
main()
{
char a[30]="string(1)";
char b[]="string(2)";
printf("before strnact() :%s\n", a);
printf("after strncat() :%s\n", strncat(a,b,6));
}


执行


before strnact() : string(1)
after strncat() : string(1) string


 


strncpy(拷贝字符串)


相关函数


bcopy,memccpy,memcpy,memmove


表头文件


#include<string.h>


定义函数


char * strncpy(char *dest,const char *src,size_t n);


函数说明


strncpy()会将参数src字符串拷贝前n个字符至参数dest所指的地址。


返回值


返回参数dest的字符串起始地址。


范例


#inclue <string.h>
main()
{
char a[30]="string(1)";
char b[]="string(2)";
printf("before strncpy() : %s\n",a);
printf("after strncpy() : %s\n",strncpy(a,b,6));
}


执行


before strncpy() : string(1)
after strncpy() : string(1)


 


strpbrk(查找字符串中第一个出现的指定字符)


相关函数


index,memchr,rindex,strpbrk,strsep,strspn,strstr,strtok


表头文件


#include <include.h>


定义函数


char *strpbrk(const char *s,const char *accept);


函数说明


strpbrk()用来找出参数s 字符串中最先出现存在参数accept 字符串中的任意字符。


返回值


如果找到指定的字符则返回该字符所在地址,否则返回0。


范例


#include <string.h>
main()
{
char *s="0123456789012345678901234567890";
char *p;
p=strpbrk(s,"a1 839"); /*1会最先在s字符串中找到*/
printf("%s\n",p);
p=strprk(s,"4398");/*3 会最先在s 字符串中找到*/
printf("%s\n",p);


执行


1.23E+29


 


strrchr(查找字符串中最后出现的指定字符)


相关函数


index,memchr,rindex,strpbrk,strsep,strspn,strstr,strtok


表头文件


#include<string.h>


定义函数


char * strrchr(const char *s, int c);


函数说明


strrchr()用来找出参数s字符串中最后一个出现的参数c地址,然后将该字符出现的地址返回。


返回值


如果找到指定的字符则返回该字符所在地址,否则返回0。


范例


#include<string.h>
main()
{
char *s="0123456789012345678901234567890";
char *p;
p=strrchr(s,‘5‘);
printf("%s\n",p);
}


执行


567890


 


strspn(返回字符串中连续不含指定字符串内容的字符数)


相关函数


strcspn,strchr,strpbrk,strsep,strstr


表头文件


#include<string.h>


定义函数


size_t strspn (const char *s,const char * accept);


函数说明


strspn()从参数s 字符串的开头计算连续的字符,而这些字符都完全是accept 所指字符串中的字符。简单的说,若strspn()返回的数值为n,则代表字符串s 开头连续有n 个字符都是属于字符串accept内的字符。


返回值


返回字符串s开头连续包含字符串accept内的字符数目。


范例


#include<string.h>
main()
{
char *str="Linux was first developed for 386/486-based PCs.";
char *t1="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
printf("%d\n",strspn(str,t1));
}


执行


5 /*计算大小写字母。不包含" ",所以返回Linux的长度。*/


 


strstr(在一字符串中查找指定的字符串)


相关函数


index,memchr,rindex,strchr,strpbrk,strsep,strspn,strtok


表头文件


#include<string.h>


定义函数


char *strstr(const char *haystack,const char *needle);


函数说明


strstr()会从字符串haystack 中搜寻字符串needle,并将第一次出现的地址返回。


返回值


返回指定字符串第一次出现的地址,否则返回0。


范例


#include<string.h>
main()
{
char * s="012345678901234567890123456789";
char *p;
p= strstr(s,"901");
printf("%s\n",p);
}


执行


9.01E+21


 


strtok(分割字符串)


相关函数


index,memchr,rindex,strpbrk,strsep,strspn,strstr


表头文件


#include<string.h>


定义函数


char * strtok(char *s,const char *delim);


函数说明


strtok()用来将字符串分割成一个个片段。参数s指向欲分割的字符串,参数delim则为分割字符串,当strtok()在参数s的字符串中发现到参数delim的分割字符时则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回下一个分割后的字符串指针。


返回值


返回下一个分割后的字符串指针,如果已无从分割则返回NULL。


范例


#include<string.h>
main()
{
char s[]="ab-cd : ef;gh :i-jkl;mnop;qrs-tu: vwx-y;z";
char *delim="-: ";
char *p;
printf("%s ";strtok(s,delim));
while((p=strtok(NULL,delim)))printf("%s ",p);
printf("\n");
}


执行


ab cd ef;gh i jkl;mnop;qrs tu vwx y;z /*-与:字符已经被\0 字符取代*/

  1. 关于strlen()和sizeof()

首先strlen是函数,sizeof是运算符sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型

Sizeof()

编译时计算,参数可以是数组、指针、类型、对象、函数等。
    它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。
    所以,sizeof不能用来返回动态分配的内存空间的大小。
    实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。

Strlen()

参数必须是字符型指针(char*), 且必须是以‘\0‘结尾的。当数组名作为参数传入时,实际上数组就退化成指针了。

如果你的缓冲区中没有以‘\0‘结束,那么strlen()计算的时候就会溢出到时数字很大,大到你吓一跳。

2.小试牛刀

现在得把上面常用的字符串函数给摘过来,练练。

首先我们得构思一个程序流程出来:

申请一段堆空间p 和一段栈空间

用栈空间的缓存区接收一段来自屏幕的字符串输入

将字符串中的小写拷贝到p 并全部改成大写

若是出现‘%‘这个字符 我们将其及其后2个字符全部拷贝到p那里去

在其中若是找到ABC的字串就在拷贝到p的时候替换成$

源代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main(void)
{
char flag1 = ‘%‘;
char flag2 = ‘$‘;
//申请一段堆空间p 和一段栈空间
char buffer[32];
char *q,*r;
printf("内存开始分配\n");
char *p = (char *)malloc(32*sizeof(char));
printf("内存清零完成\n");
memset(p,0,32);
//用栈空间的缓存区接收一段来自屏幕的字符串输入
printf("请输入字符串:");
scanf("%s",buffer);
q = p;
r = buffer;

while(q || r)
{
if(*r == ‘\0‘)
break;
//将字符串中的小写拷贝到p 并全部改成大写
//isupper(测试字符是否为小写英文字母)
if(islower(*r))
{
printf("找到了一个小写字母\n");
*q++ = toupper(*r++);
}
//若是出现‘%‘这个字符 不管其后大小写情况如何我们将其及其后3个字符全部拷贝到p那里去
//int strcmp(const char *s1,const char *s2);
else if( strncmp(r,&flag1,1) == 0)
{
printf("找到了一个%%\n");
//char * strncpy(char *dest,const char *src,size_t n);
strncpy(q,r,3);
q += 3;
r += 3;
}
/*
* 在其中若是找到ABC的字串就在当前q的位置插入一个$
* 需要ABC的起始地址是当前为位置
*/

//char *strstr(const char *haystack,const char *needle);
else if(strstr(r,"ABC") == r )
{
printf("找到一次ABC\n");
//char *strcpy(char *dest,const char *src);
strncpy(q++,&flag2,1);
r += 3;
}

else
q++,r++;

}

//输出最后的字符
printf("最后的字符串已经变成:%s\n",p);

//释放内存
free(p);
printf("内存释放完毕\n");
return 0;
}
 

3.各个平台运行效果

在RHEL7上

在RHEL6上

在MAC上

在Solaris11上

时间: 2024-10-10 02:28:39

Unix/Linux环境C编程入门教程(30) 字符串操作那些事儿的相关文章

Unix/Linux环境C编程入门教程(12) openSUSECCPP以及Linux内核驱动开发环境搭建

1. openSUSE是一款优秀的linux. 2.选择默认虚拟机 3.选择稍后安装操作系统 4.选择linux  opensuse 5. 选择默认虚拟机名称 6.设置处理器为双核. 7.内存设置为2G 8. 选择网络地址转换 9.设置IO控制器 10. 选择默认磁盘类型 11.创建一个新的虚拟磁盘 12.设置磁盘大小 13.选择路径保存虚拟磁盘 14. 完成虚拟机创建 15.设置虚拟机 16.选择opensuse镜像 17.开启虚拟机 18.虚拟机启动 19.安装opensuse 20.安装程

Unix/Linux环境C编程入门教程(5) Red Hat Enterprise Linux(RHEL)环境搭建

Unix/Linux版本众多,我们推荐Unix/Linux初学者选用几款典型的Unix/Linux操作系统进行学习. Red Hat Enterprise Linux是Red Hat公司的Linux发行版,面向商业市场,包括大型机.红帽公司从Red Hat Enterprise Linux 5开始对企业版LINUX的每个版本提供10年的支持[1].而Red Hat Enterprise Linux常简作RHEL. 1. 启动Vmware,如果没有安装的话,请看前面VMware安装的视频 2.选中

Unix/Linux环境C编程入门教程(41) C语言库函数的文件操作详解

?? 上一篇博客我们讲解了如何使用Linux提供的文件操作函数,本文主要讲解使用C语言提供的文件操作的库函数. 1.函数介绍 fopen(打开文件) 相关函数 open,fclose 表头文件 #include<stdio.h> 定义函数 FILE * fopen(const char * path,const char * mode); 函数说明 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态. mode有下列几种形态字符串: r 打开只读文件,该文件必须存

Unix/Linux环境C编程入门教程(1) Solaris 11 64bit环境搭建

Unix/Linux版本众多,我们推荐Unix/Linux初学者选用几款典型的Unix/Linux操作系统进行学习. 本文就带大家来安装Solaris 11 64位并且配置好C/C++开发环境 本文所需软件下载地址 33.  F2 开始安装 34.待安装完成 按F8重启 35.重启后的界面  直接回车  启动 36. 登陆切换到我们刚刚创建的用户 待切成功的时候我们就加载合成的镜像文件sol-11_1-repo-full.iso 然后我们切换到root用户 37.先取消掉已连接的状态 38.重新

Unix/Linux环境C编程入门教程(24) MySQL 5.7.4 for Red Hat Enterprise 7(RHEL7)的安装

远观历史, MySQL的主要目的是为了能够在单处理器核心的商业服务器上运行.如今MySQL的一个变化用户可能不会注意到,那就是甲骨文已经开始重新架构MySQL的代码,使它大量的模块化.如软件解析器,优化和复制功能以模块化的形式被重写.该版本的查询性能得以大幅提升,比 MySQL 5.6 提升 1 倍,新版本的 MySQL 在测试平台上可达到每秒 512000 只读 QPS,而 MySQL 5.6 最高只能到 250000 QPS.该性能的提升是通过其 Memcached 插件实现的.同时该版本在

Unix/Linux环境C编程入门教程(40) 初识文件操作

?? 1.函数介绍 close(关闭文件) 相关函数 open,fcntl,shutdown,unlink,fclose 表头文件 #include<unistd.h> 定义函数 int close(int fd); 函数说明 当使用完文件后若已不再需要则可使用close()关闭该文件,二close()会让数据写回磁盘,并释放该文件所占用的资源.参数fd为先前由open()或creat()所返回的文件描述词. 返回值 若文件顺利关闭则返回0,发生错误时返回-1. 错误代码 EBADF 参数fd

Unix/Linux环境C编程入门教程(31) 数学函数带你战胜企业面试

1.函数介绍: abs()acos()asin()atan()atan2()ceil()cos()cosh()exp()frexp()ldexp()log()log10()pow()sin()sinh()sqrt()tan()tanh() abs(计算整型数的绝对值) 相关函数 labs, fabs 表头文件 #include<stdlib.h> 定义函数 int abs (int j) 函数说明 abs()用来计算参数j的绝对值,然后将结果返回. 返回值 返回参数j的绝对值结果. 范例 #i

Unix/Linux环境C编程新手教程(22) C/C++怎样获取程序的执行时间

1.问:知道程序执行时间我们能够做什么? 在<C++应用程序性能优化>一书中,假设大家读过相信大家一定对性能优化这一块很上心,文中总是对优化前后的时间对照很直观给我们一个感受. 那么我们怎样利用C语言提供的库函数获取一个应用程序的各阶段的执行效率,通过数据分析出该程序的瓶颈而且做出对应的优化. 本文给大家解说的clock()函数. 2.我们首先看一看C/C++标准文档对于clock()函数的解说 3.函数原型 clock_t clock (void); 函数返回值 clock()返回从&quo

Unix/Linux环境C编程新手教程(12) openSUSECCPP以及Linux内核驱动开发环境搭建

1. openSUSE是一款优秀的linux. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaXRjYXN0Y3Bw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" /> 2.选择默认虚拟机 3.选择稍后安装操作系统 4.选择linux  opensuse 5. 选择默认虚拟机名称 6.设置处理器为双核. watermark/2/text/a