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