精华内容
下载资源
问答
  • strcpy函数

    千次阅读 2020-04-12 11:42:06
    strcpy函数 有道面试题,复习下。 已知strcpy函数的原型是: char * strcpy(char * strDest,const char *strSrc);不调用库函数,实现strcpy函数。其中,strSrc是原字符串,strDest是目标字符串。 (1)不调用C++/C的...

    strcpy函数

    有道面试题,复习下。
    已知strcpy函数的原型是:
    char * strcpy(char * strDest,const char *strSrc);不调用库函数,实现strcpy函数。其中,strSrc是原字符串,strDest是目标字符串。
    (1)不调用C++/C的字符串库函数,请编写函数 strcpy
    (2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?

    // A code block
    var foo = 'bar';
    
    (1) 
    #include "stdlib.h"
    #include "stdio.h"
    #include "string.h"
     
     
    char * strcpy(char * strDest,const char * strSrc)
    {
    	char* tmp = strDest;
     
    	if (!strSrc || !strDest)
    	{
    		return NULL;
    	}
    	if (strDest == strSrc)
    	{
    		return strDest;
    	}
     
    	while ((*strDest++ = *strSrc++) != '\0');
     
    	return tmp;
    }
     
    int main()
    {
    	char* strSrc = "copyme";
    	char strDest[100] = {0};
    	strcpy(strDest, strSrc);
    	return 1;
    }
    
    

    面试官更想你写出

    // A code block
    var foo = 'bar';
    
    char *strcpy(char *strDest, const char *strSrc);
    {
        assert((strDest!=NULL) && (strSrc !=NULL)); //检验参数
        char *address = strDest; 					//保存原始的strDest
        while( (*strDest++ = * strSrc++) != ‘\0) 
       		NULL ;
        return address ; 
    }
    

    值得注意的问题

    A,检查指针的有效性时使用((!strDest) || (!strSrc))或(!(strDest && strSrc)),说明答题者对C语言中类型的隐式转换没有深刻认识。在本例中char *转换为bool即是类型隐式转换,这种功能虽然灵活,但更多的是导致出错概率增大和维护成本升高。所以C++专门增加了bool、true、false三个关键字以提供更安全的条件表达式。

    B, 检查指针的有效性时使用((strDest == 0) || (strSrc == 0)),说明答题者不知道使用常量的好处。直接使用字面常量(如本例中的0)会减少程序的可维护性。0虽然简单,但程序中可能出现很多处对指针的检查,万一出现笔误,编译器不能发现,生成的程序内含逻辑错误,很难排除。而使用NULL代替0,如果出现拼写错误,编译器就会检查出来。

    C,return new string(“Invalid argument(s)”);,说明答题者根本不知道返回值的用途,并且他对内存泄漏也没有警惕心。从函数中返回函数体内分配的内存是十分危险的做法,他把释放内存的义务抛给不知情的调用者,绝大多数情况下,调用者不会释放内存,这导致内存泄漏。
    D,return 0;,说明答题者没有掌握异常机制。调用者有可能忘记检查返回值,调用者还可能无法检查返回值(见后面的链式表达式)。妄想让返回值肩负返回正确值和异常值的双重功能,其结果往往是两种功能都失效。应该以抛出异常来代替返回值,这样可以减轻调用者的负担、使错误不会被忽略、增强程序的可维护性。

    D,忘记保存原始的strDest值,说明答题者逻辑思维不严密。
      
      [4]
      (A)循环写成while (*strDest++=*strSrc++);,同[1]。
      (B)循环写成while (*strSrc!=’\0’) *strDest++=*strSrc++;,说明答题者对边界条件的检查不力。循环体结束后,strDest字符串的末尾没有正确地加上’\0’。…

    strcpy 能把 strSrc 的内容复制到 strDest,为什么还要 char * 类型的返回值?

    答:为了实现链式表达式。

    例如:int length = strlen( strcpy( strDest, “hello world”) );
    
    展开全文
  • strcpy 函数

    2012-10-14 18:42:59
    一、自己编写一个标准strcpy函数: char*strcpy(char*str_dst,const char*str_org) {  assert( (strDest != NULL) && (strSrc != NULL) );   char *address = strDest;   while( (*strDest++ = * ...

    一、自己编写一个标准strcpy函数:

    char*strcpy(char*str_dst,const char*str_org)   

    {

        assert( (strDest != NULL) && (strSrc != NULL) );   

        char *address = strDest; 
        while( (*strDest++ = * strSrc++) != '/0' ); 
        return address; 

    }

    得分点:

    //将源字符串加const,表明其为输入参数,加2分 

    //对源地址和目的地址加非0断言,加3分 

    //为了实现链式操作,将目的地址返回,加3分! 

    二、找错题 

     试题1: 
    void test1() 

     char string[10]; 
     char* str1 = "0123456789"; 
     strcpy( string, str1 ); 


    字符串str1需要11个字节才能存放下(包括末尾的'/0'),而string只有10个字节的空间,strcpy会导致数组越界;

      

    试题2: 

    void test2() 

     char string[10], str1[10]; 
     int i; 
     for(i=0; i<10; i++) 
     { 

      str1 = 'a'; 

     } 
     strcpy( string, str1 ); 

    如果面试者指出字符数组str1不能在数组内结束可以给3分;如果面试者指出strcpy(string, str1)调用使得从str1内存起复制到string内存起所复制的字节数具有不确定性可以给7分,在此基础上指出库函数strcpy工作方式的给10 分;
      注:

         C语言标准库函数   

          原型声明:extern char *strcpy(char *dest,const char *src);
      头文件:string.h
      功能:把从src地址开始且含有NULL结束符的字符串赋值到以dest开始的地址空间
      说明:src和dest所指内存区域不可以重叠且dest必须有够的空间来容纳src的字符串。
      返回指向dest的指针。
     
     试题3: 
    void test3(char* str1) 

     char string[10]; 
     if( strlen( str1 ) <= 10 ) 
     { 
      strcpy( string, str1 ); 
     } 

    if(strlen(str1) <= 10)应改为if(strlen(str1) < 10),因为strlen的结果未统计'/0'所占用的1个字节。
    展开全文
  • C++ - 实现strcpy函数

    万次阅读 多人点赞 2019-02-26 11:57:24
    分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net /* * Created by Chimomo */ #include "stdio.h"... * @par...

    分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net 

    /*
     * Created by Chimomo
     */
    
    #include "stdio.h"
    
    /**
     * Copies a string.
     *
     * @param dest The destination string.
     * @param src The null-terminated source string.
     * @return Returns the destination string.
     */
    char *myStrCpy(char *dest, const char *src) {
        char *tmp = dest;
    
        while (*dest++ = *src++);
        *dest = '\0';
    
        return tmp;
    }
    
    int main(int argc, char *argv[]) {
        char s1[] = "Hello, World!";
        char s2[20];
        myStrCpy(s2, s1);
        printf("%s\n", s2);
        return 0;
    }
    
    // Output:
    /*
    Hello, World!
    
    */

     

    展开全文
  • Strcpy函数

    2010-06-23 13:16:00
    已知 strcpy 函数的原型是 char *strcpy(char *strDest, const char *strSrc); 其中 strDest 是目的字符串,strSrc 是源字符串。 (1)不调用C++/C 的字符串库函数,请编写函数 strcpy

    已知 strcpy 函数的原型是

    
    
    其中 strDest 是目的字符串,strSrc 是源字符串。
    (1)不调用C++/C 的字符串库函数,请编写函数 strcpy

    char *strcpy(char *strDest, const char *strSrc)
    {
    assert((strDest!=NULL) && (strSrc !=NULL));
    char *address = strDest;
    while( (*strDest++ = * strSrc++) !='\0')
    NULL ;
    return address ;
    }
    当判断语句为假时,assert弹出警告窗口哦!

    (2)strcpy 能把strSrc 的内容复制到strDest,为什么还要char * 类型的返回值?
    答:为了实现链式表达式。

    例如 int length = strlen( strcpy( strDest, “hello world”) );

     

    展开全文
  • 已知strcpy函数的原型是 char strcpy(char strDest, const char strSrc); 其中strDest是目的字符串,strSrc是源字符串 */ #include <iostream> using namespace std; char* myStrcpy(char* strDest, ...
  • C语言strcpy函数的使用

    万次阅读 多人点赞 2020-04-19 11:00:53
    strcpy简单使用: #include <stdio.h> #include <string.h> struct Student { int sid; char name[20]; int age; } st; //此处分号不可省略 int main(void) { struct Student st = {1000,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,217
精华内容 4,086
关键字:

strcpy函数