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;
}