C/C++ 常用的一些函数

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 while
   void * 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;
}


------------------------以下是C++ 部分-------------------

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;  
}  


5、字符串string 去掉空格(C++中没有提供,就自己封装一个)

/*
* 去掉空格
*/
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;
}


你可能感兴趣的:(C/C++ 常用的一些函数)