strcpy函数用法

来源:互联网 发布:医院和农合的网络系统 编辑:程序博客网 时间:2024/05/16 13:51
 

  原型:extern char *strcpy(char *dest,char *src);
       
  用法:#include <string.h>
 
  功能:把src所指由NULL结束的字符串复制到dest所指的数组中。
 
  说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
        返回指向dest的指针。
 
  举例:


      // strcpy.c
     
      #include <syslib.h>
      #include <string.h>

      main()
      {
        char *s="Golden Global View";
        char d[20];
       
        clrscr();
       
        strcpy(d,s);
        printf("%s",d);

        getchar();
        return 0;
      }

题目:
    已知strcpy函数的原型是:
        char * strcpy(char * strDest,const char * strSrc);
    1.不调用库函数,实现strcpy函数。
    2.解释为什么要返回char *。

    解说:
    1.strcpy的实现代码

        char * strcpy(char * strDest,const char * strSrc)
        {
                if ((strDest==NULL)||(strSrc==NULL)) //[1]
                        throw "Invalid argument(s)"; //[2]
                char * strDestCopy=strDest;  //[3]
                while ((*strDest++=*strSrc++)!='\0'); //[4]
                return strDestCopy;
        }


    错误的做法:
    [1]
    (A)不检查指针的有效性,说明答题者不注重代码的健壮性。
    (B)检查指针的有效性时使用((!strDest)||(!strSrc))或(!(strDest&&strSrc)),说明答题者对C语言中类型的隐式转换没有深刻认识。在本例中char *转换为bool即是类型隐式转换,这种功能虽然灵活,但更多的是导致出错概率增大和维护成本升高。所以C++专门增加了bool、true、false三个关键字以提供更安全的条件表达式。
    (C)检查指针的有效性时使用((strDest==0)||(strSrc==0)),说明答题者不知道使用常量的好处。直接使用字面常量(如本例中的0)会减少程序的可维护性。0虽然简单,但程序中可能出现很多处对指针的检查,万一出现笔误,编译器不能发现,生成的程序内含逻辑错误,很难排除。而使用NULL代替0,如果出现拼写错误,编译器就会检查出来。
    [2]
    (A)return new string("Invalid argument(s)");,说明答题者根本不知道返回值的用途,并且他对内存泄漏也没有警惕心。从函数中返回函数体内分配的内存是十分危险的做法,他把释放内存的义务抛给不知情的调用者,绝大多数情况下,调用者不会释放内存,这导致内存泄漏。
    (B)return 0;,说明答题者没有掌握异常机制。调用者有可能忘记检查返回值,调用者还可能无法检查返回值(见后面的链式表达式)。妄想让返回值肩负返回正确值和异常值的双重功能,其结果往往是两种功能都失效。应该以抛出异常来代替返回值,这样可以减轻调用者的负担、使错误不会被忽略、增强程序的可维护性。
    [3]
    (A)忘记保存原始的strDest值,说明答题者逻辑思维不严密。
    [4]
    (A)循环写成while (*strDest++=*strSrc++);,同[1](B)。
    (B)循环写成while (*strSrc!='\0') *strDest++=*strSrc++;,说明答题者对边界条件的检查不力。循环体结束后,strDest字符串的末尾没有正确地加上'\0'。

    2.返回strDest的原始值使函数能够支持链式表达式,增加了函数的“附加值”。同样功能的函数,如果能合理地提高的可用性,自然就更加理想。
    链式表达式的形式如:
        int iLength=strlen(strcpy(strA,strB));
    又如:
        char * strA=strcpy(new char[10],strB);
    返回strSrc的原始值是错误的。其一,源字符串肯定是已知的,返回它没有意义。其二,不能支持形如第二例的表达式。其三,为了保护源字符串,形参用const限定strSrc所指的内容,把const char *作为char *返回,类型不符,编译报错。


  在上面的语句中,循环语句while ((*strDest++=*strSrc++)!='\0');较难理解,可以把这句理解为以下操作。   第一种:   while(1)   {   char temp;   temp=*strDest=*strSrc;   strDest++;   strSrc++;   if('\0'==temp)   break;   }   第二种:   while(*strSrc!='\0')   {   *strDest=*strSrc;   strDest++;   strSrc++;   }   *strDest=*strSrc;

另外,再贴一个标准C函数库,也是挺不错的

http://www.utas.edu.au/infosys/info/documentation/C/CStdLib.html

 总之是:串的操作基本都需要单独处理就对了。

1.  给一个字符串赋值的方法

a. 直接赋值,只能用于直接给字符串,而不能字符串变量。这个方法尽量不要使用。

eg. char str[200]=”I am baibai”;

注意不可以直接str[200]=”I am baibai”,

b.   Strcpy,可以用于字符串变量之间的赋值,strcpy()函数拷贝字符串。strcpy()函数将源字符串的每个字节拷贝到目录字符串中,当遇到字符串末尾的null字符(\0)时,它会删去该字符,并结束拷贝。

衍生:strncpy(destination, source, length)这个可以给定长度的拷贝,也就是将后者的值赋给前者。strncpy()函数有3个参数:第一个参数是目录字符串;第二个参数是源字符串;第三个参数是一个整数,代表要从源字符串拷贝到目标字符串中的字符数

c.   sprintf()函数:和fprintf的用法一致,只是将文件指针改成字符串地址。这个比较简单,也相当的方便,优势在于可以转换多种类型的变量成字符串的形式。虽然有数字转化的其他方法,但是推荐这个方式,比较简单。

例如

char str[20];

num=1;

sprintf(str,”baibai’s file_%d.txt”,num);

 

2.  改变一个字符串

a. 直接令值。如果只是改变其中的一两个字符就比较简单。

定位所在字符。例如:想改变char str[20]=”i’m baibai”的第一个字符,可以直接令值的方法str[0]=‘I’

b. 加上一个字符串。strcat();

注意这个函数的使用strcat(destination,source);就直接将source加上了,不要写成destination=strcat(source);

c.  删掉某个字符串的部分——这个我没有找到那个具体对应的函数,哪个告诉我,我现在的方法是用strncpy,拷一部分

3.  定位一个字符串中的字符

a.  求算字符串的长度,strlen(),这个虽然不是定位,但是经常会在这里用到

b.  strchr()使用这个函数来找,通常你需要check字符串里面有没有需要的内容。例子挺好,我贴过来了,注意指针。(偶还常用的是if(str[3]==’-’))这个没有普遍意义,就不讲了,呵呵)

#include <string.h>
#include <stdio.h>
int main(void)
 {
    char string[15];
    char *ptr, c = 'r';
    strcpy(string, "This is a string");
    ptr = strchr(string, c);
    if (ptr)
       printf("The character %c is at position: %d\n", c, ptr-string);
    else
       printf("The character was not found\n");
    return 0;
 }
 

c.另外比较规范的方式,就是规范式的方法,偶这里不知道怎么用,呜呜呜,有些笨,谁告我一下哈

4.  比较两个字符串

主要是在判断的时候使用,还是很常见的

-----------------------------------------------------------------
    函  数  名                   作  用
-----------------------------------------------------------------
    strcmp()         对两个字符串进行大小写敏感的比较
    strcmpi()        对两个字符串进行大小写不敏感的比较
    stricmp()        同strcmpi()
    strncmp()        对两个字符串的一部分进行大小写敏感的比较
    strnicmp()       对两个字符串的一部分进行大小写不敏感的比较
-----------------------------------------------------------------
 

5.  打印格式

打印,呵呵,有的时候会需要按照自己想要的打印,eg,只打印前5个,

printf(“%8.5s”,str);

8相当于打出一个档子来给你在这里面打印,正值右起,负值左起

5就是打印字符串的长度

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 机票名字多了个字母安检怎么办 出隧道口限速40超速了怎么办 社保交了五年后断交以后该怎么办 躺椅折叠椅坐的地方坏了怎么办 苹果手机锁频密码忘了怎么办 客户要货公司不给进怎么办 高铁23:00买的票怎么办 带电子手刹的车刹车失灵怎么办 下坡刹车失灵遇行人不看车怎么办 跟大车后面看不见红灯闯了怎么办 跟着大货车后面闯了红灯怎么办 如果用工单位不发放加班工资怎么办 事故家属要司机向医院多交钱怎么办 在大学里和室友关系弄僵怎么办 房产证办出来房产局不给证怎么办 单位全员竞聘老员工没岗位怎么办 快件被快递公司签收了没给送怎么办 总公司跑路了分公司代理法人怎么办 大使馆领的结婚证现在离婚怎么办 日本签证照片被使馆贴错了怎么办 在菲律宾护照和签证丢了怎么办 新疆工地上班老板不肯发工资怎么办 德国大使馆签证如果拒签了怎么办 护照在大使馆办签证期间出国怎么办 法院两次判决不准离婚我该怎么办? 法院判决不准离婚妻子不回来怎么办 被告人在不调解的情况下怎么办 知道弟兄的孩子是别人的怎么办? 办居住证的回执单丢了怎么办 领取居住证的回执单丢了怎么办 北京居住证网上申报信息填错怎么办 买家退回来的货有问题怎么办 居转户过程中生的小孩户口怎么办 人才引进申请上海户口被拒怎么办 网络购高铁票身份证没有验证怎么办 高速遇到很浓的团雾怎么办 对于大巴不按座位坐的人该怎么办 火车上遇到占座不让的人怎么办 滁州婴儿打疫苗的绿本子怎么办 检查四维说宝宝嘴巴显示不清怎么办 携程订票付款成功一直没出票怎么办