网站做实名验证码华为做网站

pingmian/2026/1/26 19:38:31/文章来源:
网站做实名验证码,华为做网站,域名备案管理系统,wordpress关键词插件在linux C 编程中#xff0c;我们经常遇到字符串的处理#xff0c;最多的就是字符串的长度、拷贝字符串、比较字符串等#xff1b;当然现在的#xff23;库中为我们提供了很多字符串处理函数。熟练的运用这些函数#xff0c;可以减少编程工作量#xff0c;这里介绍几个常… 在linux C 编程中我们经常遇到字符串的处理最多的就是字符串的长度、拷贝字符串、比较字符串等当然现在的库中为我们提供了很多字符串处理函数。熟练的运用这些函数可以减少编程工作量这里介绍几个常用的字符串函数并编写一些程序如果没有这些库函数我们将如何实现其功能 求字符串长度函数 strlen 头文件string.h 函数原型size_t strlen(const char *s) 功能求字符串长度不含字符串结束标志\0 如果没有这个函数我们如何实现strlen呢 程序如下 [cpp] view plaincopy #include stdio.h   #include string.h      int mystrlen(const char *p)   {       int i  0;       while(p[i])           i;          return i;   }      int main()   {       int len;       char str[]  Helloworld;       len  mystrlen(str);       printf(len  %d\n,len);          return 0;   }   执行结果如下 [cpp] view plaincopy fsubuntu:~/qiang/string$ gcc -o strlen strlen.c   fsubuntu:~/qiang/string$ ./strlen   len  10   同样可以实现求字符串长度功能。 既然在讲strlen()在这里多说明一下注意strlen()与sizeof()的区别 sizeof和strlen有以下区别  sizeof是一个操作符strlen是库函数。  sizeof的参数可以是数据的类型也可以是变量而strlen只能以结尾为‘\0‘的字符串作参数。  编译器在编译时就计算出了sizeof的结果。而strlen函数必须在运行时才能计算出来。并且sizeof计算的是数据类型占内存的大小而strlen计算的是字符串实际的长度。  数组做sizeof的参数不退化传递给strlen就退化为指针了。 注意有些是操作符看起来像是函数而有些函数名看起来又像操作符这类容易混淆的名称一定要加以区分否则遇到数组名这类特殊数据类型作参数时就很容易出错。最容易混淆为函数的操作符就是sizeof。 说明指针是一种普通的变量从访问上没有什么不同于其他变量的特性。其保存的数值是个整型数据和整型变量不同的是这个整型数据指向的是一段内存地址。 2、字符串拷贝函数strcpy() 头文件string.h 函数原型char *strcpy(char *dest,const char *src) 功能 字符串拷贝 参数src为源串的起始地址dest为目标串的起始地址 如果没有这个函数我们将如何实现呢程序如下 [cpp] view plaincopy #include stdio.h      char *mystrcpy(char *dest,const char *src)   {       char *p;       p  dest;       while(*src)       {           *dest  *src;       }       *dest  \0;          return p;   }      int main()   {       const char str1[]  Helloworld;       char str2[30];       mystrcpy(str2,str1);       printf(str2  %s\n,str2);          return 0;   }   执行结果如下 [cpp] view plaincopy fsubuntu:~/qiang/string$ ./strcpy    str2  Helloworld   同样能够得到结果当然有了strcpy()会很方便 3、字符串连接接函数strcat 头文件string.h 函数原型char  *strcat(char *dest,const char *src) 功能把字符串src连接到字符串dest的后面 实现方法 [cpp] view plaincopy #include stdio.h      char *mystrcat(char *dest,const char *src)   {       char *p;       p  dest;       while(*dest)           dest;       while(*src)       {           *dest  *src;       }          *dest  \0;          return p;   }      int main()   {          char str1[]  hello;       char str2[]  world;       mystrcat(str1,str2);          printf(str1  %s\n,str1);          return 0;      }   执行结果如下 [cpp] view plaincopy fsubuntu:~/qiang/string$ gcc -o strcat strcat.c   fsubuntu:~/qiang/string$ ./strcat   str1  helloworld   在使用strcat函数时需要注意目标数组应该有足够的空间连接源串。注意目标字符串\0被删除然后连接源串。如果越界会发生什么呢我们可以来验证一下 [cpp] view plaincopy #include stdio.h   #include string.h      int main()   {       char str2[6]  world;       char str1[6]  hello;       strcat(str1,str2);       printf(str1  %s\n,str1);          return 0;   }   执行结果如下 [cpp] view plaincopy fsubuntu:~/qiang/string$ gcc -o strcat1 strcat1.c    fsubuntu:~/qiang/string$ ./strcat1   str1  helloworld   *** stack smashing detected ***: ./strcat1 terminated    Backtrace:    /lib/i386-linux-gnu/libc.so.6(__fortify_fail0x45)[0xb76cbd95]   /lib/i386-linux-gnu/libc.so.6(0x103d4a)[0xb76cbd4a]   ./strcat1[0x80484d7]   /lib/i386-linux-gnu/libc.so.6(__libc_start_main0xf3)[0xb75e14d3]   ./strcat1[0x80483d1]    Memory map:    08048000-08049000 r-xp 00000000 08:01 830810     /home/fs/qiang/string/strcat1   当然下面还有好多这里就不展示了我们来看看结果helloworld能打印出来编译时也没错误但执行时告知溢出了。 我们稍微修改程序大家注意区别 [cpp] view plaincopy #include stdio.h   #include string.h      int main()   {       char str1[6]  hello;       char str2[6]  world;       strcat(str1,str2);       printf(str1  %s\n,str1);       printf(str2  %s\n,str2);              return 0;   }   输出结果如下 [cpp] view plaincopy fsubuntu:~/qiang/string$ gcc -o strcat1 strcat1.c    fsubuntu:~/qiang/string$ ./strcat1   str1  helloworld   str2  orld   并没有溢出(实际是溢出了) 是不是很有意思大家看看两者程序的区别只是六七行交换了位置但一个溢出一个却不溢出为什么呢大家应该知道数据存储的方式吧第一个程序中 [cpp] view plaincopy char str2[6]  world;   char str1[6]  hello;          先定义了str2[],程序为其分配了一段连续的空间接着定义了str1[],程序会在刚才为str2[]定义的地址后面接着定义一段连续空间如果接着将str2 接在str1后面str1原来只定义了6个字节需要连接在一起需要11个字节肯定超出了我们定义的地址空间后面是一片未知区域会发生溢出但为什么程序2却没有溢出呢 [cpp] view plaincopy char str1[6]  hello;   char str2[6]  world;   这里就比较巧了因为str2是在str1后面定义的str2接在str1后面确实会溢出但溢出后的一片空间正好是str2的地址空间区域是可知的只是helloworld覆盖掉了原来str2的东西。所以不会溢出这样说大家明白吧 继续看大家有木有发现我在程序二中对str2的值进行了打印不再是原来的world,变成了orld,按道理来讲str2的值不会改变的啊大家在这里要清楚str2只是一个地址而已只负责输出当前地址以后的字符串以\0结束所以这里的orld是strcatstr1str2后str1的值但为什么是“orld”呢因为目标字符串的\0被删除然后连接串 此时str1后面的orld覆盖了原world但str2原来指向的是w的地址现在原存放w的地址处存放的是o,所以会输出orld大家是否还有疑问后面好像还有个d没有被覆盖啊为什么输出的不是orldd呢大家应该明白字符串有个结束符\0吧它将d覆盖了如果大家觉得不好理解可以画一下图就比较清楚了 其实这只是个特例让大家看一下如果数据溢出造成的后果 4、字符串比较函数strcmp 头文件string.h 函数原型int strcmp(const char *s1,const char *s2) 功能按照ASCII码顺序比较字符串s1和字符串s2的大小 如果没有这个函数我们如下实现 [cpp] view plaincopy #include stdio.h      int mystrcmp(const char *s1,const char *s2)   {       int i  0;       while(*s1 || *s2)       {           if(*s1  *s2)           {               return 1;           }           else if(*s1  *s2)           {               return -1;           }           else           {               s1;               s2;           }          }       return 0;   }      int main()   {       int n;       char str1[]  hell;       char str2[]  hello;       n  mystrcmp(str1,str2);       printf(n  %d\n,n);          return 0;   }   执行结果如下 [cpp] view plaincopy fsubuntu:~/qiang/string$ gcc -o strcmp strcmp.c    fsubuntu:~/qiang/string$ ./strcmp   n  -1   刚才提到的函数功能比较两字符串的大小好像比较抽象我们其实是比较两个字符串是否相等下面我们看个题目 题目计算字符串中子串出现的次数 什么意思呢就是helloworldhehehehellowo中比如说子串hello在字符串中出现的次数如果单纯的用getchar()获取每个字符并比较会很麻烦在这里我们可以用strcmp来实现会很方便大家可以看看strcmp的具体应用实现程序如下 [cpp] view plaincopy #include stdio.h   #include string.h      int main()   {       int i  0;       int count  0;       int len1,len2;       char str1[100]  {\0};       char str2[20]  {\0};       printf(Please input two strings!\n);       scanf(%s%s,str1,str2);       len1  strlen(str1);       len2  strlen(str2);          while(i  len2  len1)       {           if(!(strncmp(str1[i],str2,len2)))           {               count;               i  len2;           }           else               i;       }              printf(count  %d\n,count);          return 0;   }   执行结果如下 [cpp] view plaincopy fsubuntu:~/qiang/string$ ./zichuan    Please input two strings!   xiaoqiangxiqiangxiaoxiaqiang   xiao   count  2   fsubuntu:~/qiang/string$    大家看看结果是不是正确的。 附转载 strcmp 字符串比较函数strcpy 字符串拷贝函数 strlen 字符串测长函数 strcat字符串连接函数sprintf格式化字符串拷贝函数等等。因为字符串就是以‘\0’结束的一段内存这些函数实质上也就是操作内存的函数所以避免不了的与指针打交道使得这些函数充满了陷阱如果这些函数使用不当很有可能在程序中埋伏下危险的陷阱使程序的稳定性遭受重创。下面我就字符串使用中一些常见的问题来进行举例说明。 一. strcpy极度危险的函数一不小心就会中招危险指数四星        strcpy的原型是这样的 char *strcpy(char *dest, const char *src) 作为常见的字符串复制函数C库中的实现是不安全的因为它不做字符串的检查以至于如果参数传入了非法指针比如src不是指向字符串的指针。后果就不堪设想程序会一直复制,直到遇到‘\0’才结束这样很有可能就会使得dest指向的内存区域缓冲区溢出使得导致不程序相干的部分出现错误这种错误也许就是致命的。所以使用这个函数一定确保第二个参数传入合法的指针。 例子: [cpp] view plaincopy #include string.h   #include stdlib.h   #include stdio.h      char dest[5]  {D};   char mydata[7]  {m,y,d,a,t,a,\0};      int main(void)   {           char i;           char source[5];           char bound[5]  {,,,,};              for (i  0; i  5; i)                   source[i]  S;              printf(before strcopy, mydata is %s\n, mydata);           strcpy(dest, source);           printf(dest is %s\n, dest);           printf(after strcopy, mydata is %s\n, mydata);      }   程序中定义了两个全局数组我们知道C语言的全局变量要放在DATA段而dest与mydata因为定义相连所以其内存地址是相邻的。程序的目的是复制一个字符串到dest数组而程序中忘了给source数组最后加上\0。所以source就不是一个字符串用它传递给strcpy就会造成意想不到的后果。本程序中strcpy一直复制内存到dest直到在遇到‘\0’ 这样就会多复制很多数据到dest从而意外的覆盖mydata甚至有时还会导致程序崩溃。在拷贝之前, mydata的数据是 mydata, 而在拷贝之后造成了意外的修改。 二. strcat 造成缓冲区溢出的隐形杀手危险指数 三星 strcat 是将一个字符串连接到另外一个字符串上其函数原型为char *strcat(char *dest,char *src)。这个函数也很危险因为C语言的实现也是不安全的传入非法的指针有可能会造成程序的崩溃。首先保证两个指针都应该指向字符串其次dest指针指向的空间要足以容的下src指向的字符串否则会造成缓冲区溢出而破坏其他程序数据。 例子1 [cpp] view plaincopy #include string.h   #include stdlib.h   #include stdio.h      char dest[5]  {D, \0};   char mydata[7]  {m,y,d,a,t,a,\0};      int main(void)   {           char i;           char source[5];           char bound[5]  {,,,,};              for (i  0; i  4; i)                   source[i]  S;           source[4]  \0;           printf(before strcat, mydata is %s\n, mydata);           strcat(dest, source);           printf(dest is %s\n, dest);           printf(after strcat, mydata is %s\n, mydata);      }   这个例子因为目标dest只有5个字节大小并且数据占了一个字节只剩下四个字节位置而源数据字符串长度为4个字符加一个‘\0’有五个字节大小所以会多出一个字节覆盖了mydata的数据多出的‘\0’成为了mydata的第一个字节导致调用strcat后输出mydata为空。 例子2 [cpp] view plaincopy #include string.h   #include stdlib.h   #include stdio.h      char dest[5]  {D, D, D, D, D};   char mydata[7]  {m,y,d,a,t,a,\0};      int main(void)   {           char i;           char source[5];           char bound[5]  {,,,,};              for (i  0; i  4; i)                   source[i]  S;           source[4]  \0;           printf(before strcat, mydata is %s\n, mydata);           strcat(dest, source);           printf(dest is %s\n, dest);           printf(after strcat, mydata is %s\n, mydata);      }   这个例子中dest不是字符串没有‘\0’结尾导致strcat从地址dest处开始找\0找到\0后并在此地址上复制source的数据在本程序中就将source连接到了mydata后面导致mydata变成了“mydataSSSS”,这样也破坏了程序无关的数据本程序中还好是破坏的DATA中的数据如果是其他的数据那么后果不不仅仅是数据改变这么简单了。 三.  strlen 很多malloc函数缓冲区溢出问题的始作俑者 危险指数 二星 strlen是字符串求长函数但是它求出的长度不包括‘\0’所以在用malloc分配内存的时候很容易少分配一个字节就这小小的一个字节就会造成缓冲区溢出我们知道malloc分配的内存区域是有一个头的这样就有可能破坏其他malloc的头使得内存释放失败带来一系列连锁反映。因为malloc函数的实现与系统有关这个不好用程序模拟但是这种情况确实存在。因此如果用strlen求字符串长度用于malloc一定要记住要加1。 四.  sprintf 同样可以造成缓冲区溢出危险指数 一星 sprintf是格式化字符拷贝函数函数原型是int sprintf( char *buffer, const char *format, … ) 。这个函数的实现也是不安全的使用这个函数要确保buffer足够大否则这个函数在不做任何提示的情况下就将buffer溢出这个函数虽然返回复制的字节数可以通过这个检查复制了多少个字节以确定是否缓冲区溢出。但这种亡羊补牢的做法其实没有实际意义。缓冲区溢出的错误已经发生也许会是程序崩溃检测的时间也许都没有就算有检测时间也只是用于提示程序的BUG在正式的程序中没有多大用处。 例子  [cpp] view plaincopy #include string.h   #include stdlib.h   #include stdio.h      char dest[2]  {D};   char mydata[7]  {m,y,d,a,t,a,\0};      int main(void)   {           char i;           char source[5];           char bound[5]  {,,,,};              for (i  0; i  4; i)                   source[i]  S;           source[4]  \0;           printf(before sprintf, mydata is %s\n, mydata);           sprintf(dest, %s, source);           printf(dest is %s\n, dest);           printf(after sprintf, mydata is %s\n, mydata);      }   这个例子中目标缓冲区只有两个字节的大小而源字符串却是五个字节sprintf在不进行任何提示的情况下默默的覆盖了mydata的数据。 总结         总上所述C语言字符串操作函数一般都不对参数做检查需要调用者确保参数的合法性。如果传入不正确的参数就会造成缓冲区溢出。轻则数据被修改重则程序崩溃。最郁闷的是影响到程序中不相关的部分。我前面举的例子都很简单很容易一眼看出问题的所在但是大型程序就不会这么简单了这些错误就是致命的。所以使用C语言的字符串函数时一定要养成良好的习惯自己检查参数的合法性然后再调用。目前C语言中这些字符串操作函数都有一些安全的版本就是带n的系列比如strncpystrncatsnprintf。这些函数规定了源字符串的大小对缓冲区溢出的预防有一定的作用比如snprintf其函数原型是int snprintf(char *str, size_t size, const char *format, ...) 第二个参数size可以保证复制size个字节如果要复制的字符串大于size就会截短从而保证str不会溢出。程序中尽量使用这些安全的版本。良好的习惯是一个程序稳定与健壮的保证而良好的习惯都是使用这些常用的函数养成的所以一定要主要这些字符串函数的使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/85417.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

贵州易广建设集团网站普像工业设计网站

视频云存储/安防监控/视频汇聚平台EasyCVR基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。安防视频监控系统EasyCVR拓展性强,视频能力丰富,具体可实现视频监控直播、视频轮播、视频录像、云…

深圳个人做网站综合返利商城网站建设

APP 上线以后可能遇到的问题:① APP 强退② 数据加载失败③ APP 潜在问题错误日志需要记录的内容数据表 error_log 字段:idapp_id:app 类别 iddid:客户端设备号version_id:版本号version_mini:小版本号erro…

做网站都是怎么收费上海猎头公司电话

本篇教程介绍了HTMLCSS入门 自定义模板详解&#xff0c;希望阅读本篇文章以后大家有所收获&#xff0c;帮助大家HTMLCSS入门。<首先总的stylecss和大模板都是当初angel_Kitty学姐的&#xff0c;嗯&#xff0c;连接在这&#xff0c;可以自己去看&#xff1a;自定义页面风格设…

铜陵市网站建设运城网站建设价格

一.引例&#xff08;哥尼斯堡七桥问题&#xff09; 哥尼斯堡七桥问题是指在哥尼斯堡市&#xff08;今属俄罗斯&#xff09;的普雷格尔河&#xff08;Pregel River&#xff09;中&#xff0c;是否可以走遍每座桥一次且仅一次&#xff0c;最后回到起点的问题。这个问题被认为是图…

站群cms源码seo外包网站

JGroups是Bela Ban的用于可靠消息交换的软件&#xff0c;该软件高度可配置&#xff0c;可以使用TCP或UDP作为传输协议。 基本上&#xff0c;您在多个客户端上运行JGroup&#xff0c;它们构成一个集群&#xff0c;它们可以在集群内发送和接收消息。 JGroups由JBoss Infinispan内…

手机网站模版php源码广东省建设信息网三类人员

在日常生活和工作中&#xff0c;经常会遇到需要修改文件夹名称的情况。有时候是因为文件夹名称中包含了数字&#xff0c;有时候是因为文件夹名称不符合规范。无论出于什么原因&#xff0c;修改文件夹名称都是一件非常繁琐的事情。尤其是需要修改大量文件夹名称时&#xff0c;手…

来几个好看的网站湘阴网站建设

给你一棵二叉搜索树&#xff0c;请你 按中序遍历 将其重新排列为一棵递增顺序搜索树&#xff0c;使树中最左边的节点成为树的根节点&#xff0c;并且每个节点没有左子节点&#xff0c;只有一个右子节点。 示例 1&#xff1a; 输入&#xff1a;root [5,3,6,2,4,null,8,1,null…

在线股票交易网站开发手机制作价格表的软件

2017-08-01 13:40:17在程序运行过程中&#xff0c;总会遇到各种各样的错误。有的错误是程序编写有问题造成的&#xff0c;比如本来应该输出整数结果输出了字符串&#xff0c;这种错误我们通常称之为bug&#xff0c;bug是必须修复的。有的错误是用户输入造成的&#xff0c;比如让…

搜索引擎在哪里获取网站wordpress模糊搜索插件

二分查找属于静态查找表&#xff0c;当以有序表表示静态查找表时&#xff0c;查找函数可用折半查找来实现。 查找过程&#xff1a;先确定待查记录所在的范围&#xff08;区间&#xff09;&#xff0c;然后逐步缩小范围直到找到或找不到该记录为止。 以处于区间中间位置记录的…

专业网站建设机构建筑专业网站有哪些

&#x1f4bb; React 基础篇&#xff08;二&#xff09;&#x1f3e0;专栏&#xff1a;React &#x1f440;个人主页&#xff1a;繁星学编程&#x1f341; &#x1f9d1;个人简介&#xff1a;一个不断提高自我的平凡人&#x1f680; &#x1f50a;分享方向&#xff1a;目前主攻…

大丰网站建设网站开发文档百度文库

列表 是最常用到的组件 一 ForEach 渲染控制语法————Foreach Foreach的作用 遍历数组项&#xff0c;并创建相同的布局组件块在组件加载时&#xff0c; 将数组内容数据全部创建对应的组件内容&#xff0c; 渲染到页面上 const swiperImage: Resource[] {$r("app.me…

重庆网站建设狐灵wordpress The7 v4.4.8深度汉化

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年【R1快开门式压力容器操作】试题及解析及R1快开门式压力容器操作模拟试题&#xff0c;包含R1快开门式压力容器操作试题及解析答案和解析及R1快开门式压力容器操作模拟试题练习。安全生产模拟考试一点通结合国家…

外贸婚纱网站 侵权网站自适应

[网鼎杯 2020 朱雀组]Think Java swagger [[swagger]] 首先下载源码&#xff0c;查看之后发现 查找swagger资料&#xff0c;或者扫描&#xff0c;得到&#xff1a;swagger-ui.html swagger-ui 提供了一个可视化的UI页面展示描述文件。接口的调用方、测试、项目经理等都可以…

韶关市手机网站建设怎么样襄阳教育云平台网站建设

HarmonyOS的开发语言是ArkTS、JS(JavaScript)。 ArkTS简介 ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript&#xff08;简称TS&#xff09;生态基础上做了进一步扩展&#xff0c;继承了TS的所有特性&#xff0c;是TS的超集。因此&#xff0c;在学习…

正安县网站seo优化排名长春市建设集团

一、变量 1&#xff09;. 命名规则&#xff1a; 1. 变量名不能使用系统关键字或保留关键字 2. 变量区分大小写 3. 变量命名由字母&#xff0c;数字&#xff0c;下划线组成但不能以数字开头 4. 不需要声明变量类型 是 a 1 非 int a 1 5. 查看变量内存地址 id(a), id(b) 6…

企业为什么选择网站建设奉贤网站建设推广

打开powerDesigner 新建 PDM(物理数据模型) 添加表字段 双击表&#xff0c;设置ID自增 选择导出数据库表SQL 导出成功 使用三方工具连接数据库&#xff0c;然后运行对应SQL文件即可 导入SQL文件数据到powerDesigner

做药的常用网站thinkphp5做的网站

getModelName() 获取当前Model的名称getTableName() 获取当前Model的数据表名称switchModel(type,varsarray()) 动态切换模型table() 设置当前操作的数据表field() 设置要查询的数据字段where() 设置查询或者操作条件data(data) 设置数据对象order(order) 设置排序limit(limit)…

建设网站的不足百度学术论文查重官网入口

目录 Django 使用Mysql数据库本地安装Mysql数据服务安装好Pymysql服务Django配置数据库迁移各种报错无法找到mysqlclient数据库拒绝连接 Django 使用Mysql数据库 本地安装Mysql数据服务 安装好Pymysql服务 python3 -m pip install PyMySQL官方文档介绍 Django配置 官网文档 …

宿城区住房和城乡建设局网站做动感影集的网站

今天25学堂跟大家推荐一款非常有趣和简单的APP图标生成工具&#xff1a;Iconion Icon Generator&#xff08;iconion图标生成器&#xff09; 我们可以用它来创建美丽的扁平化图标&#xff0c;长投影图标&#xff0c;桌面图标&#xff0c;社会媒体图标和移动APP图标等&#xff0…

正能量网站推荐做网站需要用到的语言

编译器实质是程序指令,不由操作系统管理 **闲逛进程:**当系统中没有就绪进程时,闲逛进程idle一直运行,优先级最低,不需要除cpu以外的任何资源 多任务操作系统具有并发和并行的特点 操作系统通过硬件地址机制保护进程的地址空间,使得每个进程只能访问自己的地址空间。 不同…