1、C中字符串处理库(string.h)中的一些函数
char * strcpy(char * s1,const char * s2) 将字符串s2复制到数组s1中,返回s1的值
注1)字符数组必须足够大,不然会出错
注2)如果第一个参数是指向一个常量的char* ,如char* a = "csef"; 这肯定是不行的,这个是不能改变数值的。
char * strncpy(char * s1,const char * s2,size_t n) 将字符串s2前n个字符复制到数组s1中,返回s1的值
注1)如果第三个参数小于s2的长度,(就是没有全部复制过去,取了一段复制)那么不会在s1后面追加空字符 “\0”, 这个要注意,自己需要加上
char * strcat(char * s1,const char * s2) s2追加到s1后面,会在最后自动追加空字符
int strcmp(const char * s1,const char * s2) 比较两个字串,等于、小于、大于分别返回0,小于0,大于0
int strncmp(const char * s1,const char * s2 , size_t n) 和上面的差不多,只是比较指定个数的字符
char * strchr(const char* s ,int c ) 在字符串中查找字符c第一次出现的位置,找到了返回相应指针,否则返回NULL
char * strrchr(const char* s ,int c ) 在字符串中查找字符c最后一次出现的位置,找到了返回相应指针,否则返回NULL
char * strstr(const char * s1,const char * s2) 在s1中查找第一次出现s2的地方(字串匹配),找到了返回相应指针,否则返回NULL
size_t strcspn(const char * s1,const char * s2) 返回s1中前面部分的长度,这个部分中不包含来自第二个字符串参数中任何字符
char * strpbrk(const char * s1,const char * s2) 查找s2中任意字符在s1中出现的位置,找到了返回指针,没有找到返回NULL
char * strtok(char * s1,const char * s2)
用s2将s1分解,获得下一个分解点的位置,如下面的例子:
char ch[] = "1111;2222;3333"; char *tokenPtr; tokenPtr = strtok(ch,";"); while(tokenPtr!=NULL){ cout<<tokenPtr<<endl; tokenPtr = strtok(NULL,";"); }//end whilevoid * memset (void *s1,int c ,size_t n )
将字符c复制到s1的前n个字节中,很多地方用来给数组初始化或者重新赋值。我们知道,指向任何数据类型的指针都可以直接赋值给void*,void*也可以赋值给任意数据类型的指针,所以,这个函数可以接收指向任何数据类型的指针。
size_t strlen (const char * s ) 返回字符串的长度,返回字串中空字符前面的字符个数
2、时间相关的函数
获得当前系统时间,获得一个long类型值,可以用来计算两个时间点的差值
/* *获得当前的系统时间 */ #include <sys/time.h> #include<time.h> long getCurrentTime() { struct timeval tv; gettimeofday(&tv,NULL); return tv.tv_sec * 1000 + tv.tv_usec / 1000; }
// 获取字符串时间 char time_buf[21]; time_t now; time(&now); strftime(time_buf, 21, "%Y-%m-%d %H:%M:%S", localtime(&now)); return string(time_buf);
// string 转化为time_t //need #include<stdio.h> time_t convert_string_to_time_t(const string & time_string) { struct tm tm1; time_t time1; int i = sscanf(time_string.c_str(), "%d/%d/%d %d:%d:%d" , &(tm1.tm_year), &(tm1.tm_mon), &(tm1.tm_mday), &(tm1.tm_hour), &(tm1.tm_min), &(tm1.tm_sec), &(tm1.tm_wday), &(tm1.tm_yday)); tm1.tm_year -= 1900; tm1.tm_mon --; tm1.tm_isdst=-1; time1 = mktime(&tm1); return time1; }
3、string 和char数组的转化
//string 转化为char数组 strcpy(motorid[num],mid.c_str()); //char数组转化为string string str; char a[]="abcd"; str=a;
4、字串分隔
#include <iostream> #include <cstring> using namespace std; int main() { char ch[] = "1111;2222;3333"; char *tokenPtr; tokenPtr = strtok(ch,";"); while(tokenPtr!=NULL){ cout<<tokenPtr<<endl; tokenPtr = strtok(NULL,";"); }//end while }或者用下面这个,也会更方便一些
//这里是用两个标号推进的,如果不是这样,而是每次匹配剩下的字符串都要通过substr复制,那效率就会很低了 vector<string> getSubString(string str,string splitmark){ vector<string> strvec; string::size_type pos1, pos2; pos2 = str.find(splitmark);例子一:基本数据类型转换例子 int转string pos1 = 0; while (string::npos != pos2) { strvec.push_back(str.substr(pos1, pos2 - pos1)); pos1 = pos2 + 1; pos2 = str.find(splitmark, pos1); } strvec.push_back(str.substr(pos1)); return strvec; }
4、数字字串和string 的转化,stringstream的用法(转int,double)
(1)例子一:基本数据类型转换例子 int转string(double这些也一样)
#include <string> #include <sstream> #include <iostream> int main() { std::stringstream stream; std::string result; int i = 1000; stream << i; //将int输入流 stream >> result; //从stream中抽取前面插入的int值 std::cout << result << std::endl; // print the string "1000" }
// #include<sstream> // #include<iomanip> inline string doubleToString(double d){ //double to string stringstream ss; ss<<setprecision(9)<<d; string str = ss.str(); return str; } double char2double(const char * ch){ // 字串 to double,保证精度 string str = ch; double result=0; stringstream s; s<<str; s>>setprecision(9)>>result; return result; }
(2) 例子二:除了基本类型的转换,也支持char *的转换。(c中可用strcpy来做)
#include <sstream> #include <iostream> int main() { std::stringstream stream; char result[8] ; stream << 8888; //向stream中插入8888 stream >> result; //抽取stream中的值到result std::cout << result << std::endl; // 屏幕显示 "8888" }(3)在多次转换中,使用同一个stringstream对象,需要使用其对象方法str来重置stringstream的buffer,这样能确保stringstream占用的内存不会越积越多 在多次转换中,使用同一个stringstream对象,需要使用其对象方法str来重置stringstream的buffer,这样能确保stringstream占用的内存不会越积越多
int main() { int size = 100; stringstream strStream; for (int i = 0; i < size; ++i) { strStream << i; string numStr; strStream >> numStr; strStream.str(""); } printf("size=%d\n", strStream.str().capacity()); return 0; }
/* * 去掉空格 */ string trim(string &sNewTag) { int begin = 0; begin = sNewTag.find(" ",begin); //查找空格在str中第一次出现的位置 while(begin != -1) //表示字符串中存在空格 { sNewTag.replace(begin, 1, ""); // 用空串替换str中从begin开始的1个字符 begin = sNewTag.find(" ",begin); //查找空格在替换后的str中第一次出现的位置 } return sNewTag; }