• 2201阅读
  • 1回复

关于strcpy的改错题 [复制链接]

上一主题 下一主题
离线那个谁
 

只看楼主 倒序阅读 使用道具 楼主  发表于: 2013-10-22

试题1:    
Void test1()
{
    char string[10];
    char* str1="0123456789";     strcpy(string, str1);
}  
试题2:    
Void test2()
{
    char string[10], str1[10];    
     for(I=0; I<10;I++)    
     {
        str1 ='a';    
     }
    strcpy(string, str1);
}  
试题3:    
Void test3(char* str1)
{
    char string[10];
    if(strlen(str1) <= 10)    
    {
        strcpy(string, str1);    
    }  
}
离线那个谁

只看该作者 沙发  发表于: 2013-10-22
剖析:  
考查对基本功的掌握: (1)字符串以'\0'结尾; 
(2)对数组越界把握的敏感度; 
(3)库函数strcpy的工作方式,如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案: 
 2分 
void strcpy( char *strDest, char *strSrc ) 

    while( (*strDest++ = * strSrc++) != '\0' ); 
}  
4分 
void strcpy( char *strDest, const char *strSrc ) //将源字符串加const,表明其为输入参数,加2分 

    while( (*strDest++ = * strSrc++) != '\0' ); 
}  
7分 
void strcpy(char *strDest, const char *strSrc) 

   //对源地址和目的地址加非0断言,加3分 
   assert( (strDest != NULL) && (strSrc != NULL) );    
   while( (*strDest++ = * strSrc++) != '\0' ); 
}  
10分 
//为了实现链式操作,将目的地址返回,加3分!  
char * strcpy( char *strDest, const char *strSrc ) 

  assert( (strDest != NULL) && (strSrc != NULL) );   
  char *address = strDest; 
  while( (*strDest++ = * strSrc++) != '\0' );    
   return address; 
}
(4)对strlen的掌握,它没有包括字符串末尾的'\0'。 
读者看了不同分值的strcpy版本,应该也可以写出一个10分的strlen函数了,完美的版本为  
int strlen( const char *str ) //输入参数const  

     assert( strt != NULL ); //断言字符串地址非0  
      int len; 
      while( (*str++) != '\0' )  
      { 
              len++;  
       } 
      return len; 
}
快速回复
限100 字节
批量上传需要先选择文件,再选择上传
 
上一个 下一个