C、C++常用函数备份(持续更新)

Table of Contents

    有些函数在程序中用的比较多, 就记下来。当然个人写的,虽然经过了简单的测试,但难免有问题,慢慢完善!!!

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