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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章