C语言笔试题(9)——strcpy函数与strlen函数

来源:互联网 发布:察网中国 知乎 编辑:程序博客网 时间:2024/04/30 02:35

1、关于strcpy的找错题:

void test1(void){ char string[10]; char* str1 = "0123456789"; strcpy( string, str1 );} 
答:字符串str1需要11个字节才能存放下(包括末尾的’\0’),而string只有10个字节的空间,strcpy会导致数组越界; 
void test2(){char string[10], str1[10]; int i; for(i = 0; i < 10; i++) {  str1[i] = 'a'; } strcpy( string, str1 );} 

答:str1的最后一个应该以'\0'进行结尾,否则用printf打印出来的str1不是aaaaaaaaaa,strcpy是把从str1地址开始且含有NULL结束符的字符串赋值到以string开始的地址空间;

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个字节

2、比较完美的strcpy函数的实现:

#include <stdio.h>#include <assert.h>char *strcpy(char *dst, char *src){char *dst_copy;assert(src != NULL && dst != NULL);dst_copy = src;while((*dst++ = *src++) != '\0');return dst_copy;}int main(void){char src[10] = "hello";char dst[10];strcpy(dst, src);printf("%s\n", dst);return 0;}

3、比较完美的strlen函数的实现:


#include <stdio.h>#include <assert.h>int strlen(char *str){int len = 0;assert(str != NULL);while((*str++) != '\0'){len++;}return len;}int main(void){char *str = "hello";int len = 0;len = strlen(str);printf("strlen: %d\n", len);return 0;}