strcpy
char *strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* my_strcpy(char *dst, char *src)
{
if(dst == NULL || src == NULL){
return NULL;
}
char *ret = dst;
while((*dst++ = *src++) != '\0');
return ret;
}
int main()
{
char src[10];
scanf("%s", &src);
char *dst = malloc(sizeof(src));
dst = my_strcpy(dst, src);
printf("%s", dst);
}
mempcy
- 增加内存重叠检测,避免dst与src重叠时(即dst>=src && dst <= src+strlen(src)),src的尾'\0'被覆盖,报错。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* my_memcpy(char *dst, const char* src, int num)
{
if(dst == NULL || src == NULL) return NULL;
char *ret = dst;
// dst 与 src 内存重叠 : 从高地址开始复制
if(dst >= src && dst <= src + num){
dst = dst + num - 1;
src = src + num - 1;
while(num--){
*dst-- = *src--;
}
}
// dst 与 src 无内存重叠 : 从地址开始复制
else{
while(num--){
*dst++ = *src++;
}
}
return ret;
}
char* my_strcpy(char *dst, const char *src)
{
if(dst == NULL || src == NULL){
return NULL;
}
return my_memcpy(dst, src, strlen(src)+1);
}
int main()
{
char src[3];
scanf("%s", &src);
my_strcpy(src+1, src);
printf("%s", src);
}
- void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void* my_memcpy(void *dst, const void* src, size_t num)
{
if(dst == NULL || src == NULL) return NULL;
void *ret = dst;
// dst 与 src 内存重叠 : 从高地址开始复制
if(dst > src && (char*)dst < (char*)src + num){
dst = (char*)dst + num - 1;
src = (char*)src + num - 1;
while(num--){
*(char*)dst-- = *(char*)src--;
}
}
// dst 与 src 无内存重叠 : 从地址开始复制
else{
dst = (char*)dst;
src = (char*)src;
while(num--){
*(char*)dst++ = *(char*)src++;
}
}
return ret;
}
char* my_strcpy(char *dst, const char *src)
{
if(dst == NULL || src == NULL){
return NULL;
}
return my_memcpy(dst, src, strlen(src)+1);
}
int main()
{
/*
char src[3];
scanf("%s", &src);
my_strcpy(src+1, src);
printf("%s", src);
*/
int src[3];
for(int i=0; i<3; i++){
scanf("%d", &src[i]);
}
my_memcpy(src+1, src, sizeof(int)*2);
for(int i=0; i<3; i++){
printf("%d ", src[i]);
}
}
strcat
char *strcat(char *dest, const char *src) 把 src 所指的字符串追加到 dest 所指向的字符串的结尾
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* strcat(char* dst, const char* src)
{
if(dst == NULL || src == NULL) return NULL;
//
char *ret = dst;
while(*dst != '\0'){
dst++;
}
while((*dst++ = *src++) != '\0');
return ret;
}
int main()
{
char src[3];
fgets(src, 3, stdin);
//scanf("%s",&src);
char dst[12] = "capybara_";
printf("%s", strcat(dst, src));
}
strlen
#include <stdio.h>
#include <assert.h>
size_t my_strlen(char *str)
{
if(str == NULL) return 0;
//assert(str != NULL);
size_t res = 0;
while(*str != '\0'){
res++;
str++;
}
return res;
}
int main()
{
/* Write C code in this online editor and run it. */
printf("Hello, World! \n");
//char *str = "hi";
char *str=NULL;
printf("%d",my_strlen(str));
return 0;
}
strcmp
int strcmp(const char *str1, const char *str2) 按字典序比较字符串str1,str2
- 如果返回值小于 0,则表示 str1 小于 str2。
- 如果返回值大于 0,则表示 str1 大于 str2。
- 如果返回值等于 0,则表示 str1 等于 str2。
#include <stdio.h>
#include <assert.h>
int my_strcmp(const char *str1, const char *str2)
{
assert(str1 != NULL && str2 != NULL);
while( *str1 && *str2 ){
if(*str1 != *str2){break;}
str1++;
str2++;
}
return *str1 - *str2;
}
int main()
{
/* Write C code in this online editor and run it. */
printf("Hello, World! \n");
char *str1 = "hi";
char *str2 = "hii";
printf("%d", my_strcmp(str1, str2));
return 0;
}