(---牛客网中刷题---)写出完整版的strcpy函数
如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案:
2分
1
2
3
4
|
void
strcpy
(
char
*strDest,
char
*strSrc )
{
while
( (*strDest++ = * strSrc++) != ‘\0’ );
}
|
4分
1
2
3
4
5
|
void
strcpy
(
char
*strDest,
const
char
*strSrc )
//将源字符串加const,表明其为输入参数,加2分
{
while
( (*strDest++ = * strSrc++) != ‘\0’ );
}
|
7分
1
2
3
4
5
6
|
void
strcpy
(
char
*strDest,
const
char
*strSrc)
{
//对源地址和目的地址加非0断言,加3分
assert
( (strDest != NULL) && (strSrc != NULL) );
while
( (*strDest++ = * strSrc++) != ‘\0’ );
}
|
10分
//为了实现链式操作,将目的地址返回,加3分!
1
2
3
4
5
6
7
8
|
char
*
strcpy
(
char
*strDest,
const
char
*strSrc )
{
assert
( (strDest != NULL) && (strSrc != NULL) );
char
*address = strDest;
while
( (*strDest++ = * strSrc++) != ‘\0’ );
return
address;
}
|
//strncpy()的实现
char * my_strncpy(char *strDest, const char *strSrc, int num)
-
{
-
assert((strDest != NULL) && (strSrc != NULL));
-
//if (strDest == NULL || strSrc == NULL) return NULL;
-
-
//保存目标字符串的首地址
-
char *strDestcopy = strDest;
-
while ((num--)&&(*strDest++ = *strSrc++) != '\0');
-
//如果num大于strSrc的字符个数,将自动补'\0'
-
if (num > 0)
-
{
-
while(--num)
-
{
-
*strDest++ = '\0';
-
}
-
}
-
return strDestcopy;
字符串拷贝函数strcpy的原型:
char *strcpy(char *strDest,const char *strSrc);
strcpy函数将strSrc拷贝至输出参数strDest中,同时函数的返回值又是strDest。这样做并非多此一举,可以获得如下灵活性:
char str[20];
int length = strlen( strcpy(str, “Hello World”) );
作用:为了生成链式表达式。
strcat:将两个char类型连接
char d[20]="GoldenGlobal"; char *s="View"; strcat(d,s);
结果放在d中
printf("%s",d);
输出 d 为 GoldenGlobalView (中间无空格)
d和s所指内存区域不可以重叠且d必须有足够的空间来容纳s的字符串。
返回指向d的
指针。
strcmp:比较两个字符串str1和str2
若str1=str2,则返回零;
若str1<str2,则返回负数;
若str1>str2,则返回正数。
strstr:strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。
在面试中常会遇到写 strcpy,以及相关的问题,比如说返回值的作用等。
->strcpy,strcat,strcmp,strstr的函数实现如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
char
*
strcpy
(
char
* dst,
const
char
* src)
{
assert
((dst!=NULL)&&(src!=NULL));
char
* cp=dst;
while
(*src!=
'\0'
)
{
*dst=*src;
src++;
dst++;
}
*dst=
'\0'
;
return
cp;
}
char
*
strcat
(
char
* dst ,
const
char
* src )
{
char
* cp = dst;
while
( *cp )
cp++;
/* find end of dst */
while
(*src!=
'\0'
)
{
*cp++=*src++;
}
*cp=
'\0'
;
return
dst;
/* return dst */
}
int
strcmp
(
const
char
* str1,
const
char
* str2)
{
int
ret = 0;
while
(!(ret=*(unsigned
char
*)str1-*(unsigned
char
*)str2) && *str1)
{
str1++;
str2++
}
if
(ret < 0)
{
return
-1;
}
else
if
(ret > 0)
{
return
1;
}
return
0;
}
char
*
strstr
(
const
char
*s1,
const
char
*s2 )
{
int
len2;
if
( !(len2 =
strlen
(s2)) )
return
(
char
*)s1;
for
( ; *s1; ++s1 )
{
if
( *s1 == *s2 &&
strncmp
( s1, s2, len2 )==0 )
return
(
char
*)s1;
}
return
NULL;
}
|
参考:https://www.cnblogs.com/carsonzhu/p/5277036.html
- 有时间看下这个博主的关于就业刷题的博客
https://blog.csdn.net/qq_34793133/article/details/80720782
-
char * my_strncpy(char *strDest, const char *strSrc, int num)
-
{
-
assert((strDest != NULL) && (strSrc != NULL));
-
//if (strDest == NULL || strSrc == NULL) return NULL;
-
-
//保存目标字符串的首地址
-
char *strDestcopy = strDest;
-
while ((num--)&&(*strDest++ = *strSrc++) != '\0');
-
//如果num大于strSrc的字符个数,将自动补'\0'
-
if (num > 0)
-
{
-
while(--num)
-
{
-
*strDest++ = '\0';
-
}
-
}
-
return strDestcopy;