String in C or C++
来源:互联网 发布:盐城市大数据产业园 编辑:程序博客网 时间:2024/05/16 11:57
String in C or C++
读书笔记
C语言
在C语言中,字符串指的是一个以’\0’结尾的char数组。关于字符串的函数通常需
要传入一个字符型指针。
// 注意区别char * str1 = "hello" ; // 常量字符串!,在文字常量,编译时求值,不可修改char str2[] = "hello" ; // char数组,运行时求值;可修改
更详细的区别和内存分区见别人博客char *c和char c[]区别
另外注意下长度sizeof 和 strlen的区别,strlen会比sizeof小1,因为’\0’的存在
几个常见函数实现
- strcpy
char *strcpy ( char *destination, const char *source ){ //copy source string to destination string while (*destination ++ = *source ++) ; // '\0'的ascii为第0个 // *destination ++ 为 *(destination ++); *和++在c中的优先级一样,但是从右到左的结合顺序 // 另外pa[i]在C语言中转换为*(pa +i);}
- strcat
char *strcat ( char *destination, const char *source ){ //Appends a copy of the source string to the destination string. while (*source != '\0') sourse ++; while (*destination != '\0'){ *sourse++ = *destination++; }}
- strcmp 相等返回0;str1 大于小于str2 返回正数或负数
int strcmp ( const char *str1, const char *str2 ){ for (; *str1 == *str2; str1++, str2++ ){ // 注意结束条件 为 "==" ! if (*str1 == '\0') retrun 0 } retrun *str1 - *str2;}
- strstr 字符串匹配,重点这个实现
- Brute-Force 算法,暴力求解;顺序遍历母串str,将每个字符作为匹配的起始字符,判断是否匹配子串target。时间复杂度 O(m*n)
char *strstr (char *str, const char *target ){ if (*target == NULL) return str; char *p1 = (char *)str; while (*p1){ char *p1Begin = p1; // 保存返回的头节点 char *p2 = (char *)target; while (*p1 && *p2 && *p1 == *p2 ){ p1++; p2++; } if (*p2 == '\0') return p1Begin; p1 = p1Begin + 1; } return NULL;}
另外一个为Rabin-Karp解法,其原理为将每一个匹配子串映射为一个hash值。例如,将子串看做一个多进制数,比较它的值与母串中相同长度子串的hash值,如果相同,再细致地按字符确认字符串是否确实相同。顺序计算母串hash值的过程中,使用增量计算的方法:扣除最高位的hash值,增加最低位的hash值。因此能在平均情况下做到O(m+n)。
其他可以看这个url http://www.cnblogs.com/yusenwu/p/4771993.html
- strlen
size_t strlen ( const char *str ){ // Returns the length of the C string str. int n; for (n = 0; *str != '\0';s++) n ++; return n;}
- atoi
int atoi (constrt char *str){ // convert char string to an int // char* b = "s500" return 0. int i=0 , n = 0; for (; str[i] >= '0'&&str[i]<='9';++i) n = 10*n + (str[i]-'0'); return n;}
- atof
// convert char string to a doubledouble atof(char s[]) { double val; double power; int i; int sign; for (i = 0; isspace(s[i]); i++) //跳过空白行 ; sign = (s[i] == '-') ? -1 : 1; if (s[i] == '-' || s[i] == '+') { i++; } for (val = 0.0; isdigit(s[i]); i++) { val = 10.0 * val + (s[i] - '0'); } if(s[i] == '.') { i++; } for (power = 1.0; isdigit(s[i]); i++) { val = 10 * val + (s[i] - '0'); power *= 10.0; // 小数点部分 } return val = sign * val / power;}
另外,对于经常出现的strcpy和memmove,这里也给出
// 防止内存重叠的正确版本,dest丢失(结束到重叠的未复制的)数据,失败。void *memmove(void *dest, const void *src, size_t n){ char *p1 = dest; const char *p2 = src; if (p2 < p1){ //内存重叠,p1低地址会被p2高地址覆盖 p2 += n; p1 += n; while ( n-- != 0) *--p1 = * --p2; //逆向复制 } else { while (n-- !=0) *p1++ = *p2++; //正向复制 } return p1;}
C++语言
在C++中,String是一个类,并且可以通过调用类函数实现判断字符串长度,字
串等等操作。
一般面试的时候,要求实现String的构造函数、拷贝构造函数、赋值函数、析构函数这几个非常重要的部分。
class String {public: String(const char *str = NULL); //通用构造函数 String(const String &str); //拷贝构造函数 ~String(); //析构函数 String& operator=(const String &str); //重载=friend ostream& operator<<(ostream &os, String &str); //输出private: char* data ; // 字符串 size_t length; // 长度};String::String(const char *str ){ if ( *str == NULL){ length = 0; data = new char[1]; *data = '\0'; } else { length = strlen(str); data = new char[length +1]; strcpy (data, str); }}String::~String(){ length = 0; delete[] data;}String::String(const String &str){ // 深拷贝 length = str.length; data = new char[length +1]; strcpy (data, str.data);}String& String::operator=(const String &str){ if (this == &str) return *this; delete []data; length = str.length; data = new char[length + 1]; strcpy(data, str.data); return *this;}ostream& operator<<(ostream &os, String &str)//输出{ os << str.data; return os;}
String的更多成员实现可以查看这篇博客http://www.cnblogs.com/zhizhan/p/4876093.html
阅读全文
0 0
- String in C or C++
- java,string,startWith or prefix predicate,in c++,for copy
- split string in C
- String in C sharp
- C Extending or ctypes in pyinotify
- GUI Toolkits in C or C++
- about the character string in C language
- NSDate format string in objective-c
- The understanding of string in C.
- C/C++---C and CXX compiler with c or cpp in struct
- Deferences between String and string in C sharp
- Character String and Character String Array in C Programming
- java or c/c++ in embedded system design
- How to 'union' 2 or more DataTables in C#?
- ARC forbids Objective-C objects in structs or unions
- ARC forbids Objective-C objects in structs or unions
- c++String
- c++string
- 软工文档感受----计划
- 使用sublime 同步编辑从excel导入数据到SQL Server数据库
- Ubuntu下安装Java及环境配置
- 赋予oracle执行存储过程权限和创建表权限
- 前端程序员遇到 Bug 时的 30 个反应,你是哪一种?
- String in C or C++
- 【Linux】文件操作总结
- Keil uVision4 的下载及破解步骤
- oracle取出多个字段列中的最大值和最小值
- TIOBE 11 月编程语言排行榜,脚本语言怎么了?
- Mybatis动态SQL
- 算法-如何计算时间复杂度?
- 10个深度学习软件的安装指南(附代码)
- 洛谷P1358 扑克牌