C语言strlen, strcpy, strcmp,strcat函数的实现

  1. #include <iostream>  
  2.   
  3. using namespace std;  
  4.   
  5. namespace MJN {  
  6.   size_t strlen(const char *str);  
  7.   char *strcpy(char *dst, const char *src);  
  8.   int strcmp(const char *str1, const char *str2);  
  9. }  
  10.   
  11. //test  
  12. int main() {  
  13.   cout << MJN::strlen("hello, world") << endl; //output: 12  
  14.   cout << MJN::strlen("") << endl;             //output: 0  
  15.   //cout << MJN::strlen(0) << endl;            //error, and no exception throw.  
  16.   
  17.   char dst[100];  
  18.   char *src = "hello, world";  
  19.   MJN::strcpy(dst, src);  
  20.   cout << dst << endl;                         //output: hello, world  
  21.   cout << MJN::strlen(dst) << endl;            //output: 12  
  22.   
  23.   char *str1 = "hello";  
  24.   char *str2 = "helle";  
  25.   cout << MJN::strcmp(str1, str2) << endl;     //output: 10  
  26.   cout << strcmp(str1, str2) << endl;          //output: 1  
  27.   str1 = 0;  
  28.   cout << MJN::strcmp(str1, str2) << endl;     //a negative number  
  29.   //cout << strcmp(str1, str2) << endl; //error  
  30.   
  31.   return 0;  
  32. }  
  33.   
  34. size_t MJN::strlen(const char *str) {  
  35.   if (!str) cerr << "MJN::strlen error: pointer to string is 0\n";  
  36.   size_t len = 0;  
  37.   while (*str++) ++len;  
  38.   return len;  
  39. }  
  40.   
  41. char * MJN::strcpy(char *dst, const char *src) {  
  42.   if (!dst || !src) {  
  43.     return dst;  
  44.   }  
  45.   char *dst_origin = dst;  
  46.   while (*dst++ = *src++);  
  47.   return dst_origin;  
  48. }  
  49.   
  50. int MJN::strcmp(const char *str1, const char *str2) {  
  51.   if (!str1 || !str2) {  
  52.     return str1 - str2;  
  53.   }  
  54.   while (*str1 && *str2 && *str1 == *str2) {  
  55.     ++str1;  
  56.     ++str2;  
  57.   }  
  58.   return *str1 - *str2;  
  59. }  

//将源字符串加const,表明其为输入参数
char * strcat ( char *strDest, const char *strSrc)
{
   // 后文return address,故不能放在assert断言之后声明address
   char *address = strDest;
   assert ((strDest != NULL) && (strSrc != NULL)); //对源地址和目的地址加非0断言
   while (*strDest)             //是while(*strDest!=’\0’)的简化形式
   {
    //若使用while(*strDest++),则会出错,因为循环结束后strDest还会执行一次++,
    //那么strDest将指向'\0'的下一个位置。/所以要在循环体内++;因为要是*strDest最后指
    //向该字符串的结束标志’\0’。
    strDest++;
   }
 
   while (*strDest++ = *strSrc++)
   {
    NULL;             //该循环条件内可以用++,
   }                   //此处可以加语句*strDest=’\0’;无必要
   return address;      //为了实现链式操作,将目的地址返回
}

/*
the C++ programming language, special edition. ch6.6-5 P140

10. (*2) Write these functions:s  strlen(), which returns the length of a C-style string; stcpy(),
which copies a string into another; and stcmp(), which compares two strings. Consider what
the argument types and return types ought to be. Then compare your functions with the standard library 
versions as declared in<cstring>(<string.h>) and as specified in 20.4.1.
*/
#include <iostream>

using namespace std;

namespace MJN {
  size_t strlen(const char *str);
  char *strcpy(char *dst, const char *src);
  int strcmp(const char *str1, const char *str2);
}

//test
int main() {
  cout << MJN::strlen("hello, world") << endl; //output: 12
  cout << MJN::strlen("") << endl;             //output: 0
  //cout << MJN::strlen(0) << endl;            //error, and no exception throw.

  char dst[100];
  char *src = "hello, world";
  MJN::strcpy(dst, src);
  cout << dst << endl;                         //output: hello, world
  cout << MJN::strlen(dst) << endl;            //output: 12

  char *str1 = "hello";
  char *str2 = "helle";
  cout << MJN::strcmp(str1, str2) << endl;     //output: 10
  cout << strcmp(str1, str2) << endl;          //output: 1
  str1 = 0;
  cout << MJN::strcmp(str1, str2) << endl;     //a negative number
  //cout << strcmp(str1, str2) << endl; //error

  return 0;
}

size_t MJN::strlen(const char *str) {
  if (!str) cerr << "MJN::strlen error: pointer to string is 0\n";
  size_t len = 0;
  while (*str++) ++len;
  return len;
}

char * MJN::strcpy(char *dst, const char *src) {
  if (!dst || !src) {
    return dst;
  }
  char *dst_origin = dst;
  while (*dst++ = *src++);
  return dst_origin;
}

int MJN::strcmp(const char *str1, const char *str2) {
  if (!str1 || !str2) {
    return str1 - str2;
  }
  while (*str1 && *str2 && *str1 == *str2) {
    ++str1;
    ++str2;
  }
  return *str1 - *str2;
}

  
  
//将源字符串加const,表明其为输入参数
char * strcat ( char *strDest, const char *strSrc)
{
   // 后文return address,故不能放在assert断言之后声明address
   char *address = strDest;
   assert ((strDest != NULL) && (strSrc != NULL)); //对源地址和目的地址加非0断言
   while (*strDest)             //是while(*strDest!=’\0’)的简化形式
   {
    //若使用while(*strDest++),则会出错,因为循环结束后strDest还会执行一次++,
    //那么strDest将指向'\0'的下一个位置。/所以要在循环体内++;因为要是*strDest最后指
    //向该字符串的结束标志’\0’。
    strDest++;
   }
 
   while (*strDest++ = *strSrc++)
   {
    NULL;             //该循环条件内可以用++,
   }                   //此处可以加语句*strDest=’\0’;无必要
   return address;      //为了实现链式操作,将目的地址返回
}


当函数参数中的字符串指针为0时,函数应该向外抛出异常(在main函数中捕获),而不是正确地返回或在函数中处理异常,在后续的版本中将会添加抛出异常的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值