逆转字符串——输入一个字符串,将其逆转并输出
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;
//ANSIC,有中文就出错
//bool ReverseStringA(char* str)
//{
// int len = strlen(str);
// unsigned char temp;
// for (int i = 0; i < len / 2; ++i)
// {
// temp = str[i];
// str[i] = str[len - i - 1];
// str[len - i - 1] = temp;
// }
// return true;
//}
//UNICODE,双字节
bool ReverseStringW(wchar_t* str)
{
int len = wcslen(str);
wchar_t temp;
for (int i = 0; i < len / 2; ++i)
{
temp = str[i];
str[i] = str[len - i - 1];
str[len - i - 1] = temp;
}
return true;
}
bool ReverseString(char* str)
{
const char* local = setlocale(LC_ALL, NULL);//返回当前本地化,setlocale(LC_ALL,"")才是使用默认本地化
char* setlocal = setlocale(LC_ALL, "chs");
int len = mbstowcs(NULL, str, NULL);
wchar_t* buf = new wchar_t[len + 1];
wmemset(buf, 0, len + 1);
int change = mbstowcs(buf, str, len+1);
if (change == len)
{
if (!ReverseStringW(buf))
{
goto ERROR;
}
change = wcstombs(NULL, buf, NULL);
change = wcstombs(str, buf, change + 1);
delete []buf;
setlocal = setlocale(LC_ALL, "");
return true;
}
ERROR:
delete[]buf;
setlocal = setlocale(LC_ALL, "");
return false;
}
int main(int argc, char* argv[])
{
//char* str = "abcde";//代码区
//char str[] = "abcde";
char str[] = "含有中文abc";
//wchar_t* str = L"含有中文abc";//代码区,又犯了!
//wchar_t str[] = L"含有中文abc";
//std::locale loc("");
//std::wcout.imbue(loc);
if (ReverseString(str))
cout << str << endl;
//wcout << buf << endl;
system("pause");
return 0;
}