字符串相关总结

str系列函数

  • 字符串的搜索,返回的都是第一次出现的位置,找不到则返回NULL
// 搜索单个字符
char *strchr(const char *s, int c);  // 从前往后
char *strrchr(const char *s, int c); // 从后往前
// 在s1中搜索s2中任一字符,不包括"\0"
char *strpbrk(const char *s1,const char *s2); 
// 搜索子串,不包括"\0"
char *strstr(const char *haystack, const char *needle);
  • 字符串的连接
// 把src连接到dest后面,返回连接后的dest
char *strcat(char *dest, const char *src); 
char *strncat(char *dest, const char *src, size_t count);

wchar_t *wcscat(wchar_t *dest, const wchar_t *src); 
wchar_t *wncat(wchar_t *dest, const wchar_t *src, size_t count);
  • 字符串的分割
//将String中保存的字符串,按照Delimiter中的字符作为分隔符进行分割。
//Context用于记录分割一次后String中下一个字符串的位置。
//如果String为NULL,则SAVE_PTR在下一次调用中将作为起始位置
char *strtok_s(char *String, const char *Delimiter, char **Context);
  • 字符串的反转
char *strrev(char *str); // 注意这个函数的参数不能是常量字符串
wchar_t *_wcsrev(wchar_t *str);
  • 字符串的比较,相等则返回0
int strcmp(const char *str1, const char *str2);
int strncmp(const char *str1, const char *str2, size_t count); 
int _stricmp(const char *str1, const char *str2); // 不区分大小写
int _strnicmp(const char *str1, const char *str2, size_t count);


int wcscmp(const wchar_t *str1, const wchar_t *str2);
int wcsncmp(const wchar_t *str1, const wchar_t *str2, size_t count); 
int _wcsicmp(const wchar_t *str1, const wchar_t *str2); // 不区分大小写
int _wcsnicmp(const wchar_t *str1, const wchar_t *str2, size_t count);
  • 字符串的拷贝
// 把src拷贝到dest,包括空值和结束符
char *strcpy(char *dest, const char *src); 
char *strncpy(char *dest, const char *src, size_t count);
// 拷贝字符串到新的内存,注意,用于接收返回值的指针,要用free手动释放内存
char *strdup(const char *str); 

wchar_t *wcscpy_s(wchar_t *dest, const wchar_t *src);
wchar_t *wcsncpy(wchar_t *dest, const wchar_t *src, size_t count);
wchar_t *wcsdup(const wchar_t *str); 
  • 字符串的大小,注意不包括"\0"
size_t strlen(const char *str); // strlen("abcd") = 4;
size_t wcslen(const wchar_t *str); // wcslen(L"abcd") = 4;
  • 字符串的大小写转换
// 将大写转换为小写
errno_t _strlwr_s(char *_Str, size_t _Size);
errno_t _wcslwr_s(wchar_t *_Str, size_t _SizeInWords);
// 将小写转换为大写
errno_t _strupr_s(char *_Str, size_t _Size);
errno_t _wcsupr_s(char * _Str, size_t _Size);

mem系列函数

// 设置内存,将buffer的前count个字符设为count
void *memset(void *buffer, int ch, size_t count); 

// 内存拷贝,将src的前count个字符拷贝到dest,区别在与当dest和from重叠时
void *memcpy(void *dest, const void *src, size_t count);  //行为不确定
void *memmove(void *dest, const void *src, size_t count); //正常

// 内存查找,在buffer中找ch字符,返回首次出现的位置,没找到则返回NULL
void *memchr(const void *buffer, int ch ,size_t count);

// 内存匹配,比较buffer1和buffer2的前count个字符
int memcmp(const void *buffer1, const void *buffer2, size_t count);

Rtl系列函数

SIZE_T RtlCompareMemory (const VOID *Source1, const VOID *Source2, SIZE_T Length);
PVOID RtlSecureZeroMemory(PVOID ptr. SIZE_T cnt);

#define RtlEqualMemory(Destination,Source,Length)         (!memcmp((Destination),(Source),(Length)))
#define RtlMoveMemory(Destination,Source,Length)           memmove((Destination),(Source),(Length))
#define RtlCopyMemory(Destination,Source,Length)           memcpy((Destination),(Source),(Length))
#define RtlFillMemory(Destination,Length,Fill)             memset((Destination),(Fill),(Length))
#define RtlZeroMemory(Destination,Length)                 memset((Destination),0,(Length))

字符串大小相关

#ifndef ARRAYSIZEOF
#define ARRAYSIZEOF(x)  sizeof (x) / sizeof (x[0])
#endif

sizeof("abcd") = 5;
sizeof(L"abcd") = 10;
wcslen(L"abcd") = 4;
strlen("abcd") = 4;
ARRAYSIZE("abcd") = 5;
ARRAYSIZE(L"abcd") = 5;
ARRAYSIZEOF("abcd") = 5;
ARRAYSIZEOF(L"abcd") = 5;
string v1 = "abcd";
v1.size() = 4;
wstring v2 = L"abcd";
v2.size() = 4;

PCHAR和PWCHAR的相互转换

PCHAR转PWCHAR

WCHAR DestPath[MAX_PATH] = { 0 };
PCHAR TempPath = "C:\\test\\test.txt";
mbstowcs_s(NULL, DestPath, MAX_PATH, TempPath, MAX_PATH);

PWCHAR转PCHAR

CHAR Temp[MAX_PATH] = { 0 };
PWCHAR FilePath = L"C:\\test\\test.txt";
wcstombs_s(NULL, Temp, MAX_PATH, FilePath, MAX_PATH);

std::string和std::wstring的相互转换

std::string
wstr2str(std::wstring wstr, UINT CodePage)
{
    std::string str;
    PCHAR temp = NULL;
    INT Len = 0;

    Len = WideCharToMultiByte(CodePage, 0, wstr.c_str(), -1, NULL, NULL, NULL, NULL);
    if (Len == 0)
    {
        return str;
    }
    temp = new char[Len + 1];
    if (temp == NULL)
    {
        return str;
    }
    WideCharToMultiByte(CodePage, 0, wstr.c_str(), -1, temp, Len, NULL, NULL);
    temp[Len] = '\0';
    str.append(temp);
    delete[] temp;
    return str;
}

std::wstring
str2wstr(std::string str, UINT CodePage)
{
    INT          nLen = 0;
    PWCHAR       temp = NULL;
    std::wstring wstr;

    nLen = MultiByteToWideChar(CodePage, 0, str.c_str(), -1, NULL, NULL);
    if (nLen == 0)
    {
        return wstr;
    }
    temp = new WCHAR[nLen + 1];
    if (temp == NULL)
    {
        return wstr;
    }
    temp[nLen] = L'\0';
    nLen = MultiByteToWideChar(CodePage, 0, str.c_str(), -1, temp, nLen);
    wstr = temp;
    delete []temp;
    return wstr;
}

十六进制转成string

std::string 
HexArrayToString(PCHAR data, INT len)
{
    const std::string hexme = "0123456789ABCDEF";
    std::string ret = "";
    for (int i = 0; i < len; i++)
    {
        ret.push_back(hexme[(data[i] & 0xF0) >> 4]);
        ret.push_back(hexme[data[i] & 0x0F]);
    }
    return ret;
}

获得系统环境变量

_dupenv_s_wdupenv_s

// 单字
PCHAR TempPath = NULL;
size_t Length = 0;
_dupenv_s(&TempPath, &Length, "temp");
free(TempPath);

// 双字
PWCHAR TempPath = NULL;
size_t Length = 0;
_wdupenv_s(&TempPath, &Length, L"ProgramFiles");
free(TempPath);

已知一个文件路径FilePath= L"C:\\test\\test.exe";,获得它的:

  1. 文件名(带后缀):FilePath.substr(FilePath.rfind('\\') + 1);
  2. 文件名(不带后缀):FileName = FilePath.substr(FilePath.rfind('\\') + 1); FileName = FileName.substr(0, FileName.rfind('.'));
  3. 文件类型:FilePath.substr(FilePath.rfind('.') + 1);
  4. 目录(不保留\):FilePath.substr(0, FilePath.rfind('\\'));
  5. 目录(保留\):FilePath.substr(0, FilePath.rfind('\\') + 1);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值