1、C语言库函数中有两个函数实现数字和字符串之间的相互转换:将数字转换成字符串的函数itoa();将字符串转换为数字的函数atoi(),下面是这两个函数的内部实现:
#include<stdlib.h> #include<stdio.h> #include <iostream> using namespace std; //字符串转换为数字 int My_atoi(char str[]){ int n, i = 0, sign = 1; while(isspace(str[i]))i++; //跳过前面的空白字符 if(str[i] == '-') { sign = -1; //记住符号位 i++; //跳过符号位 } for(n = 0; str[i] != '\0'; i++){ n = 10*n + (str[i] - '0'); //取str的最高位 } return n*sign; } //整型数字转换为字符串 void My_itoa(int n, char str[]){ char *tmp = str; //保留基址 bool sign = (n<0 ? true : false); //是否为负数 n = (n>=0 ? n : -n); //取绝对值 do{ *str++ = n%10 + '0'; //取n的最低位 } while(n /= 10); if(sign) *str++ = '-'; //添加符号位 *str = '\0'; //加空字符结尾 //反转字符串 for(--str; tmp<str; ++tmp,--str){ *tmp ^= *str; *str ^= *tmp; *tmp ^= *str; } } int main(){ char str[10] ; My_itoa(-1020, str); cout<<"itoa(-1020) = \""<<str<<"\""<<endl; cout<<"atoi(\"-1020\") = "<<My_atoi(str); return 0; }
结果:
itoa(-1020) = "-1020" atoi("-1020") = -1020
2、字符串拷贝函数strcpy()和更加通用的内存拷贝函数memcpy():strcpy()函数在各种面试笔试中被严重滥用了,就不多废话了,直接给出代码先。顺便提下,如果有人问你该函数为啥要返回char*类型,标准答案就是为了支持链式表达式 :-)
//字符串拷贝函数 char* My_strcpy(char *strDest, const char *strSrc){ assert((strDest!=NULL) && (strSrc!=NULL));//确认源字符串和目标字符串不为空 char *tmp = strDest; //保留基址 while((*strDest++ = *strSrc++) != '\0'); *strDest = '\0'; return tmp; } int main(){ char s[] = "123456789"; char d[] = "123"; My_strcpy(d, s); cout<<s<<endl; cout<<d<<endl; return 0; }
56789 123456789
int main(){ char d[] = "123"; char s[] = "123456789"; My_strcpy(d, s); cout<<s<<endl; cout<<d<<endl; return 0; }结果:
123456789 123456789
//内存拷贝函数 void* My_memcpy(char *pvTo, char *pvFrom, int n){ assert((pvTo!=NULL) && (pvFrom!=NULL)); //使用断言 char *address = pvTo; //保留基址 while(n--)*pvTo++ = *pvFrom++; return address; }
//string类的声明 class String{ public: String(const char *str = NULL); ~String(void); String& operator =(const String &other); private: char *m_data; }; //string类的实现 //析构函数 String::~String(void){ delete []m_data; //释放内存 } //构造函数 String::String(const char *str){ if(str == NULL){ m_data = new char[1]; //默认构造函数,返回一个空字符串 *m_data = '\0'; } else { m_data = new char[strlen(str)+1]; strcpy(m_data, str); } } //复制构造函数 String::String(const char &other){ m_data = new cahr[strlen(other.m_data)+1]; strcpy(m_data,other.m_data); } //赋值函数 String& String::operator =(const String &other){ if(this == &other){ //检查自赋值 return *this; } delete [] m_data; m_data = new char [strlen(other.m_data)+1]; strcpy(m_data, other.m_data); return *this; }