【C】strcpy()需谨慎使用;

  大家都知道C中的strcpy()函数是用来复制字符串的库函数。先附上代码看看strcpy()函数的功能:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define MAX 20
 4 
 5 int main(void)
 6 {
 7     char a[MAX]="abc";
 8     char b[MAX]="abcdefghi";
 9     strcpy(a,b);
10     puts(a);
11     puts(b);
12 } 

很明显,结果如下:

  此函数中还有两个高级属性——

  ①:它是char *类型,它返回的是第一个参数的值,即一个字符的地址。

  ②:第一个参数不需要指向数组的开始。

先附上代码来说明这两个属性:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define MAX 40
 4 
 5 int main(void)
 6 {
 7     char *a="beast";
 8     char b[MAX]="you are the beast one.";
 9     char *p;
10     p=strcpy(b+8,a);
11     puts(a);
12     puts(b);
13     puts(p);
14 } 

b+8的位置是the的第一个字母t,

看到这个代码你是不是认为结果如下:

beast

you ate beasteast one

beasteast one

应该是这样吗?结果呢?

为什么会这样呢?

我们再来看看strcpy()函数的功能:将一个字符串复制到另一个字符串。这个代码无疑是把字符串a复制到b的第八个位置之后。

但是字符串的特性是什么呢?字符串最后一个字节存放的是一个空字符——“\0”,用来表示字符串的结束。把a复制到b之后会令a的空字符把复制后的字符串隔断,所以会显示到beast就会结束。

而输出p怎么会输出beast呢?这就是此函数的第一个属性,此函数会返回复制之后的字符串的首地址。所以········你懂得。

可能到这里你已经发现了一些问题,如果想把一个字符串的一部分复制到另一个字符串的某个位置,该怎么办呢,显然strcpy()函数是满足不了这个功能的,strncpy()函数是为了弥补strcpy()函数不能检查目标字符串是否容纳下源字符串的不足而设定的一个函数。并且完全可以实现这个功能。

附上代码如下:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define MAX 30
 4 
 5 int main(void)
 6 {
 7     char *a="abcdefg";
 8     char b[MAX]="you are the beast one.";
 9     strncpy(b+4,a,3);
10     puts(b);
11 } 

这段代码把字符串a的前三个字符赋值到b的第五个位置之后,所以结果如下:

由于strcpy()函数和gets()函数并不会检查目标字符串是否容纳下源字符串,所以使用这两个函数需谨慎使用!

转载于:https://www.cnblogs.com/ngnetboy/archive/2012/11/19/2777384.html

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

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

相关文章

多重指针操作

之前对多重指针操作心存忐忑&#xff0c;不能很熟练使用&#xff0c;本质原因是不了解其实质&#xff0c;因此对其进行了学习。 一、简单的代码如下 #include <stdio.h> #include <stdlib.h> #include <string.h>void myArray(char ***p2, int num) {int i0;…

C++ 初始化与赋值

1、初始化与赋值的区别&#xff1a; 二者的区别不是看&#xff0c;是否有这个赋值操作符&#xff0c;而是看操作的时候&#xff0c;对象是否已经有值。 初始化&#xff1a;创建对象&#xff0c;并给它设置初始值。 赋值&#xff1a;对象已经有值&#xff0c;擦除对象的当前值&a…

如何找出MySQL数据库中的低效SQL语句

面对业务的迅猛发展&#xff0c;DBA的一项重要工作就是及时发现数据库中的低效SQL语句&#xff0c;有的可以立刻着手解决&#xff08;比如缺少合适的索引&#xff09;&#xff0c;有的需要尽快反馈给开发人员进行修改。 MySQL数据库有几个配置选项可以帮助我们及时捕获低效SQL语…

搜集的一些有意思的牛人博客地址

我要去桂林-田春峰的IT网志 http://blog.donews.com/accesine/ SEO优化的内容 转载于:https://www.cnblogs.com/zhangweilong/archive/2012/11/19/2777719.html

memory拷贝与string拷贝的区别

1、memory拷贝&#xff0c;根据拷贝的字节个数&#xff0c;从src一个一个字节拷贝到dst&#xff0c;拷贝过程不管src的取值&#xff0c;也不管dst是否能容纳。2、因此&#xff0c;对于memory拷贝&#xff0c;src中NULL字符&#xff08;取值为0的字符&#xff09;后面的字符也能…

【转载】#323 - A Generic Class is a Template for a Class

A generic classs is a class that takes one or more type parameters, which it then uses in the definition of the class. It can be thought of as a template for a class. 1 public class ThingContainer<TParam> 2 { 3   private TParam theThing; 4 5   p…

黑马程序员--ADO.Net中的知识点和难点

------- Windows Phone 7手机开发、.Net培训、期待与您交流&#xff01; ------- 1、 ADO.Net基础 程序要和数据库交互要通过ADO.Net进行&#xff0c;通过ADO.Net就能在程序中执行SQL了。 直接在项目中内嵌mdf文件的方式使用SQLServer数据库&#xff08;基于服务的数据库&#…

leetcode——15.3Sum

#include<stdio.h> #include<stdlib.h>int** threeSum(int* nums, int numsSize, int* returnSize) {if (numsSize<3)return NULL;int comNum numsSize*(numsSize - 1)*(numsSize - 2) / 6;int** ret (int**)malloc(sizeof(int*)*comNum);//先创建“用来存储一…

[New Portal]Windows Azure Virtual Machine (17) Virtual Machine成本分析

《Windows Azure Platform 系列文章目录》 在Windows Azure VM里&#xff0c;计费模式是和以下几个因素有关&#xff1a; 成本1: VM Type and VM Size 具体的计费模式请参考这里 http://www.windowsazure.com/en-us/pricing/details/virtual-machines/#service-windows 我们知道…

Servlet与JSP间的传值问题

Servlet与JSP 之间的传值有两种情况&#xff1a;JSP -> Servlet&#xff0c; Servlet -> JSP。通过对象 request和 session (不考虑 application)完成传值。一、JSP -> servletJSP页面有3种方法向 servlet传值&#xff1a; form表单、URL<!-- JSP page --> ...…

java 访问修饰符

java 访问修饰符 类、方法、成员变量和局部变量的可用修饰符 修饰符 类 成员访求 构造方法 成员变量 局部变量 abstract&#xff08;抽象的&#xff09; √ √ &#xff0d; &#xff0d; &#xff0d; static &#xff08;静态的&#xff09; &#xff0d; √ …

嵌入式Linux系统的构成和启动总结

以下内容源于网络资源的整理&#xff0c;如有侵权请告知删除。 一、嵌入式Linux系统典型结构 Flash划分成以下4个区&#xff1a; &#xff08;1&#xff09;Bootloader区。存放的是Bootloader&#xff0c;它负责嵌入式系统最初的硬件初始化、驱动和内核加载。 &#xff08;2&…

防止arp***方法

防止arp***&#xff1a;Win7下搞定ip与mac地址绑定对于玩系统的老手都知道&#xff0c;防止arp***实际上不需要这个防火墙那个防火墙&#xff0c;一句命令将ip与mac地址绑定即可。例如&#xff1a;arp -s 192.168.1.1 00-19-e0-c0-6f-0a不过这句话在Windows7显得这么无助&#…

根文件系统的简介

以下内容源于网络资源的整理&#xff0c;如有侵权请告知删除。 一、文件系统 文件系统是对一个存储设备上的数据进行组织的机制。这种机制有利于用户和操作系统的交互。 尽管内核是 Linux 的核心&#xff0c;但文件却是用户与操作系统交互所采用的主要工具。对Linux来说尤其如…

使用jQuery异步传递含复杂属性及集合属性的Model到控制器方法

Student类有集合属性Courses&#xff0c;如何把Student连同集合属性Courses传递给控制器方法&#xff1f; public class Student { public string StudentName { get; set; } public IList<Course> Courses { get; set; } } public class Course…

函数指针的使用

在学习群里看到的一个程序&#xff0c;基本说明了函数指针的用法。就摘录如下&#xff1a;

CreateThread和_beginthread的区别

1.程序&#xff1a;程序构成&#xff1a;(1)源代码(2)可执行的二进制代码程序是指令和数据的有序集合&#xff0c;其本身没有任何运行的含义&#xff0c;是一个静态的概念。由操作系统加载其可执行的二进制代码&#xff0c;分配相应的数据结构&#xff1a;进程控制块PCB(Proces…

重新注册dll

for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s %i它的作用是用循环语句并且用regsvr32命令对Windows\System32文件夹中的所有DLL文件都进行一次注册&#xff0c;以解决诸如IE无法打开二级链接这样的问题。转载于:https://blog.51cto.com/gzkhrh/1375543

hdu max sum

这题跟求最大连续数列一样的&#xff0c;稍微不同的是只要把值改为标号就可以了。 #include<stdio.h>#include<string.h>#include<stdlib.h>#include<debug.h>#defineX 100001intA[X];intmain( ){intN,M,a,b,c,d,e,f,x,i,y,sum,len0; Debug(); scanf(&…

冒泡排序 Bubble Sort

冒泡排序 冒泡排序的过程很简单&#xff0c;就是不断比较相邻两个元素的大小关系&#xff0c;若逆序则交换之&#xff0c;这样通过一轮的比较&#xff0c;关键字最大的记录就沉底了。 一般地说&#xff0c;第i趟冒泡排序是从第一个元素起到第n-i1个元素依次比较相邻两个记录的关…