有些函数在程序中用的比较多, 就记下来。当然个人写的,虽然经过了简单的测试,但难免有问题,慢慢完善!!!
// C++11 获取当前毫秒数
long long GetCurrentMilliseconds()
{
std::chrono::time_point<std::chrono::system_clock> now = std::chrono::system_clock::now();
auto duration = now.time_since_epoch();
return std::chrono::duration_cast<std::chrono::milliseconds>(duration).count();
}
// 获取格式化时间,年-月-日 时:分:秒
std::string GetTimeString(time_t t) {
if (t == -1) {
return "";
}
struct tm *local = localtime(&t);
char timeChars[50];
strftime(timeChars, 50, "%Y-%m-%d %H:%M:%S", local);
return std::string(timeChars);
}
// boost获取格式化时间,包括毫秒
std::string GetDateTimeForMillisecond()
{
boost::posix_time::time_facet* facet = new boost::posix_time::time_facet("%Y-%m-%d %H:%M:%S.%f"); // 不需要释放
std::stringstream date_stream;
date_stream.imbue(std::locale(date_stream.getloc(), facet));
//date_stream << boost::posix_time::microsec_clock::universal_time(); // 差8小时
date_stream << boost::posix_time::microsec_clock::local_time();
std::string milli_str = date_stream.str();
milli_str = milli_str.substr(0, milli_str.find_last_of('.') + 4); // 微秒改为毫秒
return milli_str;
}
// 字节大小格式化,包含头文件#include <iomanip>
std::string bytesFormat(int size)
{
std::stringstream ss;
if (size < 1024) {
ss << size << "B";
} else if (size < 1024 * 1024) {
ss << std::setiosflags(std::ios::fixed) << std::setprecision(2) << (size * 1.0 / 1024) << "KB";
} else if (size < 1024 * 1024 * 1024) {
ss << std::setiosflags(std::ios::fixed) << std::setprecision(2) << (size * 1.0 / 1024 / 1024) << "MB";
} else {
ss << std::setiosflags(std::ios::fixed) << std::setprecision(2) << (size * 1.0 / 1024 / 1024 / 1024) << "GB";
}
return ss.str();
}
// 产生随机字符串
std::string BuildRandString(int num)
{
static unsigned int s_add = 0;
std::string ret;
srand((unsigned int)time(NULL) + (s_add++));
for (int i=0; i<num; )
{
char buf[17] = {0};
_itoa_s(rand(), buf, 0x10);
ret += buf;
i += strlen(buf);
}
return ret.substr(0, num);
}
/*!
\fn void trim_left(char *&str)
\brief 去掉字符串左边的空格字符
\param in,out str 源字符串
\return
*/
void trim_left(char *&str)
{
if (str == NULL)
{
return;
}
while (*str)
{
if (*str == ' ')
{
str++;
}
else
{
break;
}
}
}
/*!
\fn void trim_right(char *&str_src)
\brief 去掉字符串右边的空格字符
\param in,out str_src 源字符串
\return
*/
void trim_right(char *&str_src)
{
if (str_src == NULL)
{
return;
}
char *str = str_src;
while (*str)
{
str++;
}
--str;
while (*str)
{
if (*str == ' ')
{
--str;
}
else
{
++str;
*str = '\0';
break;
}
}
}
/*!
\fn string find_row_str(const string str_src, int nrow)
\brief 返回源串(列用一个或多个空格分隔)中的指定列子串
\param in str_src 源字符串
\param in nrow 指定第几列
\return 结果子串
*/
string find_row_str(const string str_src, int nrow)
{
string str_dest;
if (str_src.empty() || nrow < 1)
{
return str_dest;
}
string str = str_src;
str.insert(str.end(), 1, ' ');
int num = 0;
while (1)
{
int pos1, pos2;
pos1 = str.find(" ");
if (-1 != pos1)
{
++num;
if (num == nrow)
{
str_dest = str.substr(0, pos1);
break;
}
string temp = str.substr(pos1);
pos2 = temp.find_first_not_of(" ");
if (-1 != pos2)
{
str = temp.substr(pos2);
}
else
{
break;
}
}
else
{
break;
}
}
return str_dest;
}
// 去掉string左右两边的空格
void trim_left_right(string &str)
{
if (!str.empty())
{
int i;
int len = str.size();
for (i=0; i<len; i++)
{
if (str[i] != ' ')
{
break;
}
}
str.erase(0, i);
len = str.size();
for (i=len-1; i>0; i--)
{
if (str[i] != ' ')
{
break;
}
}
str.erase(i+1, len);
}
}
#include<stdio.h>
#include<stdlib.h>
typedef unsigned int u32;
//迭代法 按位交换32位整形的高位与低位(如:0和31、1和30...交换)
u32 reverse_val(u32 val)
{
u32 low, hig;
// 1<<((sizeof(val)<<3)-1)相当于2的31次方
for (low=1, hig=1<<((sizeof(val)<<3)-1); low<hig; low<<=1, hig>>=1)
{
// 判断低位与高位是否相等
if (((val&low) && !(val&hig)) || (!(val&low) && (val&hig)))
{
// 交换高位与低位
val ^= low;
val ^= hig;
}
}
return val;
}
int main(void)
{
u32 val = 0x0000008;
printf("src=0x%.8x, dest=0x%.8x\n", val, reverse_val(val));
return 0;
}
// C语言实现栈
#include <stdio.h>
#include <stdlib.h>
#define S_OK 1
#define S_ERROR 0
#define STACK_SIZE 124
#define STACK_INCREMENT 16
typedef char elem;
typedef int Status;
typedef struct
{
elem *base;
elem *top;
int size;
}STACK;
Status CreateStack(STACK &s)
{
s.base = (elem*)malloc(sizeof(elem)*STACK_SIZE);
if (!s.base)
{
return S_ERROR;
}
s.top = s.base;
s.size = STACK_SIZE;
return S_OK;
}
Status DestroyStack(STACK &s)
{
if (s.size > 0)
{
free(s.base);
s.size = 0;
return S_OK;
}
else
{
return S_ERROR;
}
}
Status ClearStack(STACK &s)
{
if (s.size == 0)
{
return S_ERROR;
}
s.top = s.base;
return S_OK;
}
Status StackEmpty(STACK s)
{
if (s.size>0 && s.base==s.top)
{
return S_OK;
}
else
{
return S_ERROR;
}
}
Status Push(STACK &s, elem e)
{
if (s.size == 0)
{
return S_ERROR;
}
if (s.top-s.base >= s.size)
{
s.base = (elem*)realloc(s.base, (s.size+STACK_INCREMENT)*sizeof(elem));
if (!s.base)
{
return S_ERROR;
}
s.top = s.base+s.size;
s.size += STACK_INCREMENT;
}
*s.top++ = e;
return S_OK;
}
Status Pop(STACK &s, elem &e)
{
if (s.size>0 && s.base!=s.top)
{
e = *(--s.top);
return S_OK;
}
else
{
return S_ERROR;
}
}
Status GetTop(STACK s, elem &e)
{
if (s.size==0 || s.base==s.top)
{
return S_ERROR;
}
e = *(s.top-1);
return S_OK;
}
int StackLength(STACK s)
{
int len = 0;
if (s.size > 0)
{
len = int(s.top - s.base);
}
return len;
}
int main(void)
{
STACK s;
CreateStack(s);
// ...
DestroyStack(s);
return 0;
}
bool IPStringToUlong(const char* strSrc, unsigned long &ulDst)
{
bool bret = false;
struct in_addr addr;
if (0 != inet_aton(strSrc, &addr))
{
ulDst = addr.s_addr;
bret = true;
}
return bret;
}
bool IPUlongToString(unsigned long ulSrc, char* strDst)
{
bool bret = false;
struct in_addr addr;
char* str = NULL;
addr.s_addr = ulSrc;
str = inet_ntoa(addr);
if (NULL != str)
{
strcpy(strDst, str);
bret = true;
}
return bret;
}
bool BinarySearch(const unsigned long* ipPtr, int size, unsigned long ulDst, int &iPos)
{
int low = 0;
int high = size-1;
int mid;
while (low <= high)
{
mid = low + ((high-low) / 2);
if (ipPtr[mid] == ulDst)
{
iPos = mid;
return true;
}
if (ipPtr[mid] > ulDst)
{
high = mid - 1;
}
else
{
low = mid + 1;
}
}
iPos = mid;
return false;
}
// 查找父串中的子串,存在返回子串在父串中的地址,否则返回NULL
char* my_strstr(char *parStr,char *subStr)
{
for (;;++parStr)
{
char *s1 = parStr;
for (char *s2 = subStr; ; ++s1, ++s2)
{
if (!*s2)
{
return parStr;
}
if (*s1 != *s2)
{
break;
}
}
if (!*s1)
{
return NULL;
}
}
}
static const char hex_chars[] = "0123456789abcdef";
int light_isdigit(int c) {
return (c >= '0' && c <= '9');
}
int light_isxdigit(int c) {
if (light_isdigit(c)) return 1;
c |= 32;
return (c >= 'a' && c <= 'f');
}
int light_isalpha(int c) {
c |= 32;
return (c >= 'a' && c <= 'z');
}
int light_isalnum(int c) {
return light_isdigit(c) || light_isalpha(c);
}
int buffer_to_lower(char *b) {
char *c;
if (b == 0) return 0;
for (c = b; *c; c++) {
if (*c >= 'A' && *c <= 'Z') {
*c |= 32;
}
}
return 0;
}
int buffer_to_upper(char *b) {
char *c;
if (b == 0) return 0;
for (c = b; *c; c++) {
if (*c >= 'a' && *c <= 'z') {
*c &= ~32;
}
}
return 0;
}
char int2hex(char c) {
return hex_chars[(c & 0x0F)];
}
char hex2int(unsigned char hex) {
hex = hex - '0';
if (hex > 9) {
hex = (hex + '0' - 1) | 0x20;
hex = hex - 'a' + 11;
}
if (hex > 15)
hex = 0xFF;
return hex;
}
// 上面函数0返回真,非0为假
int main(void)
{
int iret;
iret = light_isxdigit('a');
printf("light_isdigit = %d\n", iret);
iret = light_isalnum(3);
printf("light_isalpha = %d\n", iret);
char s[12] = {0};
strncpy(s, "CDAdfDdff", 9);
buffer_to_lower(s);
printf("lower s = %s\n", s);
printf("int2hex = %c\n", int2hex(14));
printf("hex2int = %d\n", hex2int('F'));
char str1[] = "abcdefgdfs";
char str2[] = "efg";
printf("str = %s\n", my_strstr(str1, str2));
return 0;
}
// 字节流转换为十六进制
std::string toHex(unsigned char arr[], size_t len)
{
std::string retVal;
char buf[4];
for (size_t i=0; i<len; i++) {
sprintf_s(buf, "%02X ", arr[i]);
retVal.append(buf);
}
retVal[retVal.size() - 1] = '\0';
return retVal;
}
#include <cctype>
std::string trim(std::string&& s)
{
s.erase(std::find_if_not(s.rbegin(), s.rend(), std::isspace).base(), s.end());
s.erase(s.begin(), std::find_if_not(s.begin(), s.end(), std::isspace));
return std::move(s);
}
std::vector<std::string> split(const std::string& s, const std::string& delimiter)
{
std::vector<std::string> output;
if (delimiter.empty())
{
output.push_back(s);
return output;
}
const size_t delimiter_length = delimiter.length();
size_t i = 0;
for (size_t pos = s.find(delimiter); pos != std::string::npos; pos = s.find(delimiter, pos))
{
output.push_back(s.substr(i, pos - i));
pos += delimiter_length;
i = pos;
}
// Add the rest of the string after the last delimiter, unless there is nothing after it
if (i != s.length())
{
output.push_back(s.substr(i, s.length()));
}
return output;
}
std::string replace_all(std::string&& s, const std::string& search, const std::string& rep)
{
size_t pos = 0;
while ((pos = s.find(search, pos)) != std::string::npos)
{
s.replace(pos, search.size(), rep);
pos += rep.size();
}
return std::move(s);
}