您的位置:首页 > 编程语言 > C语言/C++

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

2014-06-22 12:49 441 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: