用C语言实现strcpy,strncpy,strcat,strcmp,strlen函数
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#endif
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
//方法一:
while((*strDest++ = *strSrc++) != '\0');
return str;
*/
//方法二:
//此种方法可以考虑到内存重叠的情况,但需要后续定义的mystrmemcpy函数
int count = mystrlen(strSrc) + 1;
str = mystrmemcpy(strDest, strSrc, count);
return str;
}
char *mystrmemcpy(char *strDest, const char *strSrc, int n)
{
assert(NULL != strDest && NULL != strSrc);
char *str = strDest;
if(strSrc < strDest && strSrc + n -1 >= strDest)
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
共有两个makefile文件,第一个在Mystring文件夹里,用以向o_file问价里那个makefile跳转,从而编译生成执行文件。
while(*strDest++ != '\0');
strDest--;
while((*strDest++ = *strSrc++) != '\0');
return str;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
*/
/*
//方法二:
int len = 0;
while(*strSrc != '\0')
{
len++;
strSrc++;
}
return len;
*/
//方法三:
const char *str = strSrc;
while(*strSrc++ != '\0');
return (int)strSrc - (int)str - 1;
int mystrcmp(const char *strDest, const char *strSrc);
int mystrlen(const char *strSrc);
char *mystrncpy(char *strDest, const char *strSrc, int n);
char *mystrmemcpy(char *strDest, const char *strSrc, int n);
用C语言实现strcpy,strncpy,strcat,strcmp,strlen函数
(本文介绍的函数都是在Linux平台下实现的)
首先介绍下文件存放结构:
1.所有文件都在Mystring这个文件夹里:
2.Mystring文件夹里又有四个文件夹(bin, include, o_file, src)和一个主makefile(Makefile)文件:
strncpy函数,mystrncpy.c:
#include"../include/mystring.h"
char *mystrncpy(char *strDest, const char *strSrc, int n)
{
assert(NULL != strDest && NULL != strSrc);
scanf("%d", &i);
char *str;
switch(i)
{
case 1:
{
str = mystrcpy(str1, str2);
printf("操作结果为:\n");
puts(str);
break;
}
case 2:
{
int n;
printf("请输入n的值:");
fflush(stdout);
if(str2[mystrlen(str2) - 1] == '\n')
{
str2[mystrlen(str2) - 1] = '\0';
}
printf("你可以选择如下操作:\n");
printf("1.将第二个字符串拷贝到第一个字符串\n");
printf("2.将第二个字符串的前n个字符拷贝到第一个字符串\n");
strlen函数,mystrlen.c:
#include"../include/mystring.h"
int mystrlen(const char *strSrc)
{
assert(NULL != strSrc);
/*
//方法一:
if(strSrc[0] == '\0')
return 0;
else
return mystrlen((char *)(&strSrc[0] + 1)) + 1;
strcpy函数,mystrcpy.c:
#include"../include/mystring.h"
char *mystrcpy(char *strDest, const char *strSrc)
{
assert(NULL != strDest && NULL != strSrc);
char *str = strDest;
printf("3.将第二个字符串续接到第一个字符串后面\n");
printf("4.比较两个字符串的大小\n");
printf("5.分别统计两个字符串的长度\n");
printf("6.不进行任何操作,直接退出\n");
int i;
printf("请选择你需要的操作:");
fflush(stdout);
}
case 4:
{
int j;
j = mystrcmp(str1, str2);
if(j > 0)
printf("第一个字符串大\n");
else if(j < 0)
printf("第二个字符串大\n");
else
printf("两个字符串一样大\n");
break;
}
case 5:
{
printf("第一个字符串的长度为:%d\n", mystrlen(str1));
{
//内存重叠,从高地址开始拷贝
strSrc = strSrc + n - 1;
strDest = strDest + n - 1;
while(n--)
{
*strDest-- = *strSrc--;
}
}
else
{Biblioteka Baidu
//正常情况,不存在内存重叠
while(n--)
{
*strDest++ = *strSrc++;
3.bin文件夹里存放的是编译生成的执行文件:
4.include文件夹里存放的是头文件:
5.o_file文件夹里存放的是编译生成的.o文件:
6.src文件夹里存放的是各个源文件(主函数,及几个要实现的string处理函数):
下面开始看代码:
头文件,Mystring.h:
(简单,就不注释了)
#ifndef __MYSTRING_H__
strcmp函数,mystrcmp.c:
#include"../include/mystring.h"
int mystrcmp(const char *strDest, const char *strSrc)
{
assert(NULL != strDest && NULL != strSrc);
while(*strDest && *strSrc && *strDest == *strSrc)
主函数(根据自己需要写),mystrmain.c:
#include"../include/mystring.h"
int main(int argc, char *argv[])
{
system("clear");
char str1[600];
char str2[300];
printf("请输入一个第一个字符串(不超过300个字节):\n");
strcat函数,mystrcat.c函数:
#include"../include/mystring.h"
char *mystrcat(char *strDest, const char *strSrc)
{
assert(NULL != strDest && NULL != strSrc);
char *str = strDest;
printf("第二个字符串的长度为:%d\n", mystrlen(str2));
break;
}
default:break;
}
return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define __MYSTRING_H__
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<assert.h>
char *mystrcpy(char *strDest, const char *strSrc);
char *mystrcat(char *strDest, const char *strSrc);
char *str = strDest;
int m = 0;
while(*strDest != '\0')
{
strDest++;
m++;
}
assert(n <= m);
strDest = str;
while(n--)
{
*strDest++ = *strSrc++;
if(*strSrc == '\0')
{
*strDest = *strSrc;
break;
}
}
return str;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
scanf("%d", &n);
str = mystrncpy(str1, str2, n);
printf("操作结果为:\n");
puts(str);
break;
}
case 3:
{
str = mystrcat(str1, str2);
printf("操作结果为:\n");
puts(str);
break;
}
}
return str;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
{
strDest++;
strSrc++;
}
return *strDest - *strSrc;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
fgets(str1, 300, stdin);
if(str1[mystrlen(str1) - 1] == '\n')
{
str1[mystrlen(str1) - 1] = '\0';
}
printf("请输入一个第二个字符串(不超过300个字节):\n");
fgets(str2, 300, stdin);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
//方法一:
while((*strDest++ = *strSrc++) != '\0');
return str;
*/
//方法二:
//此种方法可以考虑到内存重叠的情况,但需要后续定义的mystrmemcpy函数
int count = mystrlen(strSrc) + 1;
str = mystrmemcpy(strDest, strSrc, count);
return str;
}
char *mystrmemcpy(char *strDest, const char *strSrc, int n)
{
assert(NULL != strDest && NULL != strSrc);
char *str = strDest;
if(strSrc < strDest && strSrc + n -1 >= strDest)
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
共有两个makefile文件,第一个在Mystring文件夹里,用以向o_file问价里那个makefile跳转,从而编译生成执行文件。
while(*strDest++ != '\0');
strDest--;
while((*strDest++ = *strSrc++) != '\0');
return str;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
*/
/*
//方法二:
int len = 0;
while(*strSrc != '\0')
{
len++;
strSrc++;
}
return len;
*/
//方法三:
const char *str = strSrc;
while(*strSrc++ != '\0');
return (int)strSrc - (int)str - 1;
int mystrcmp(const char *strDest, const char *strSrc);
int mystrlen(const char *strSrc);
char *mystrncpy(char *strDest, const char *strSrc, int n);
char *mystrmemcpy(char *strDest, const char *strSrc, int n);
用C语言实现strcpy,strncpy,strcat,strcmp,strlen函数
(本文介绍的函数都是在Linux平台下实现的)
首先介绍下文件存放结构:
1.所有文件都在Mystring这个文件夹里:
2.Mystring文件夹里又有四个文件夹(bin, include, o_file, src)和一个主makefile(Makefile)文件:
strncpy函数,mystrncpy.c:
#include"../include/mystring.h"
char *mystrncpy(char *strDest, const char *strSrc, int n)
{
assert(NULL != strDest && NULL != strSrc);
scanf("%d", &i);
char *str;
switch(i)
{
case 1:
{
str = mystrcpy(str1, str2);
printf("操作结果为:\n");
puts(str);
break;
}
case 2:
{
int n;
printf("请输入n的值:");
fflush(stdout);
if(str2[mystrlen(str2) - 1] == '\n')
{
str2[mystrlen(str2) - 1] = '\0';
}
printf("你可以选择如下操作:\n");
printf("1.将第二个字符串拷贝到第一个字符串\n");
printf("2.将第二个字符串的前n个字符拷贝到第一个字符串\n");
strlen函数,mystrlen.c:
#include"../include/mystring.h"
int mystrlen(const char *strSrc)
{
assert(NULL != strSrc);
/*
//方法一:
if(strSrc[0] == '\0')
return 0;
else
return mystrlen((char *)(&strSrc[0] + 1)) + 1;
strcpy函数,mystrcpy.c:
#include"../include/mystring.h"
char *mystrcpy(char *strDest, const char *strSrc)
{
assert(NULL != strDest && NULL != strSrc);
char *str = strDest;
printf("3.将第二个字符串续接到第一个字符串后面\n");
printf("4.比较两个字符串的大小\n");
printf("5.分别统计两个字符串的长度\n");
printf("6.不进行任何操作,直接退出\n");
int i;
printf("请选择你需要的操作:");
fflush(stdout);
}
case 4:
{
int j;
j = mystrcmp(str1, str2);
if(j > 0)
printf("第一个字符串大\n");
else if(j < 0)
printf("第二个字符串大\n");
else
printf("两个字符串一样大\n");
break;
}
case 5:
{
printf("第一个字符串的长度为:%d\n", mystrlen(str1));
{
//内存重叠,从高地址开始拷贝
strSrc = strSrc + n - 1;
strDest = strDest + n - 1;
while(n--)
{
*strDest-- = *strSrc--;
}
}
else
{Biblioteka Baidu
//正常情况,不存在内存重叠
while(n--)
{
*strDest++ = *strSrc++;
3.bin文件夹里存放的是编译生成的执行文件:
4.include文件夹里存放的是头文件:
5.o_file文件夹里存放的是编译生成的.o文件:
6.src文件夹里存放的是各个源文件(主函数,及几个要实现的string处理函数):
下面开始看代码:
头文件,Mystring.h:
(简单,就不注释了)
#ifndef __MYSTRING_H__
strcmp函数,mystrcmp.c:
#include"../include/mystring.h"
int mystrcmp(const char *strDest, const char *strSrc)
{
assert(NULL != strDest && NULL != strSrc);
while(*strDest && *strSrc && *strDest == *strSrc)
主函数(根据自己需要写),mystrmain.c:
#include"../include/mystring.h"
int main(int argc, char *argv[])
{
system("clear");
char str1[600];
char str2[300];
printf("请输入一个第一个字符串(不超过300个字节):\n");
strcat函数,mystrcat.c函数:
#include"../include/mystring.h"
char *mystrcat(char *strDest, const char *strSrc)
{
assert(NULL != strDest && NULL != strSrc);
char *str = strDest;
printf("第二个字符串的长度为:%d\n", mystrlen(str2));
break;
}
default:break;
}
return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define __MYSTRING_H__
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<assert.h>
char *mystrcpy(char *strDest, const char *strSrc);
char *mystrcat(char *strDest, const char *strSrc);
char *str = strDest;
int m = 0;
while(*strDest != '\0')
{
strDest++;
m++;
}
assert(n <= m);
strDest = str;
while(n--)
{
*strDest++ = *strSrc++;
if(*strSrc == '\0')
{
*strDest = *strSrc;
break;
}
}
return str;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
scanf("%d", &n);
str = mystrncpy(str1, str2, n);
printf("操作结果为:\n");
puts(str);
break;
}
case 3:
{
str = mystrcat(str1, str2);
printf("操作结果为:\n");
puts(str);
break;
}
}
return str;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
{
strDest++;
strSrc++;
}
return *strDest - *strSrc;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
fgets(str1, 300, stdin);
if(str1[mystrlen(str1) - 1] == '\n')
{
str1[mystrlen(str1) - 1] = '\0';
}
printf("请输入一个第二个字符串(不超过300个字节):\n");
fgets(str2, 300, stdin);