字符串的转换问题及赋值等等的问题确实很烦人,这里对遇到的问题总结一下
字符串格式化
一、unicode下字符串格式化
WCHAR tempStr[100]=L"";
swprintf(tempStr,L"今年我%d岁了",25);
结果:今年我25岁了
ASCII与UNICODE间转换
一、ASCII与UNICODE间字符串转换
ASCII->UNICODE
方法一(MultiByteToWideChar):
char temp[]="示例文本";
WCHAR string[256];
int iStrlen=sizeof(temp);
MultiByteToWideChar(CP_ACP,0,(LPCSTR)(temp),iStrlen,string,iStrlen);
方法二(A2W):
char temp[]="示例文本";
USES_CONVERSION;
LPWSTR string A2W(temp);
UNICODE ->ASCII
方法一(MultiByteToWideChar):
WCHAR string[]=L"示例文本";
char szAnsiStr[100]={0};
WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,string,-1,szAnsiStr,sizeof(szAnsiStr),NULL,NULL);
方法二(W2A):
WCHAR string[]=L"示例文本";
char szAnsiStr[100]={0};
USES_CONVERSION;
szAnsiStr=W2A(string);//代码有错误,用的时候查查W2A使用方法;
字符串操作
一、TCHAR 字符串数组的赋值memcpy、ZeroMemory
memcpy:一般的赋值方法
TCHAR szBuf[MAX_PATH] = _T("haha"); //初始化时才能用
memcpy(szBuf,_T("haha"),sizeof(_T("haha"))); //一般的赋值方法
//清空字符串
memcpy(szBuf,0,0);//这个与定义时赋空是一样的-》TCHAR szBuf[MAX_PATH]={0};
ZeroMemory:将指定内存空间清空
TCHAR *path=new TCHAR[MAX_PATH];
ZeroMemory(path,MAX_PATH);//清空内存
GetCurrentDirectory(MAX_PATH,path);//获取当前应用程序的地址
一篇文章:
http://hi.baidu.com/peidun/item/3f19114de1fc6033fb896037
二、复制、追加字符串(wcscpy、wcscat || strcpy、strcat)
char *strcpy( char *strDestination, const char *strSource );
wchar_t *wcscpy( wchar_t *strDestination, const wchar_t *strSource );
wcscpy:是strcpy的宽字符形式,strcpy用于ASCII编码,wcscpy用于UNICODE编码。
作用:将一个字符串复制到目标字符串中;
char *strcat( char *strDestination, const char *strSource );
wchar_t *wcscat( wchar_t *strDestination, const wchar_t *strSource );
wcscat:同样是strcat的宽字符形式,strcat用于ASCII编码,wcscat用于UNICODE编码;
示例:
#include <string.h>
#include <stdio.h>
void main( void )
{
char string[80];
strcpy( string, "Hello world from " );
strcat( string, "strcpy " );
strcat( string, "and " );
strcat( string, "strcat!" );
printf( "String = %s\n", string );
}
结果:
String = Hello world from strcpy and strcat!
三、字符串比较strcmp、wcscmp || _stricmp、_wcsicmp直接对比函数strcmp、wcscmp
int strcmp( const char *string1, const char *string2 );//ASCII形式
int wcscmp( const wchar_t *string1, const wchar_t *string2 );//UNICODE形式
这个函数直接将两个字符串逐个字符地按照ASCII码顺序对比,所以对于string1="quick",string2="Quick",string1>string2;
这个函数主要是用来比较两字符串的大小,如果结果>0,则表示string1>string2,结果==0,表示string1==string2,结果<0,表示string1<string2
更多地用这个函数来比较两个字符串是否相同;
示例:
#include "stdafx.h"
#include <string.h>
#include <stdio.h>
#include <Windows.h>
char string1[] = "The quick brown dog jumps over the lazy fox";
char string2[] = "The QUICK brown dog jumps over the lazy fox";
int _tmain(int argc, _TCHAR* argv[])
{
char tmp[20];
int result;
result = strcmp( string1, string2 );
if( result > 0 )
strcpy( tmp, "greater than" );
else if( result < 0 )
strcpy( tmp, "less than" );
else
strcpy( tmp, "equal to" );
printf( "\tstrcmp: String 1 is %s string 2\n", tmp );
//调用windows系统函数
Sleep(10000);
return 0;
}
转换后再对比(_stricmp、_wcsicmp)
int _stricmp( const char *string1, const char *string2 );//ASCII形式
int _wcsicmp( const wchar_t *string1, const wchar_t *string2 );//UNICODE形式
这两个函数同样是对比两字符串的函数,但他们在对比字符串前,
会把两字符串全部转换为小写形式后再对比,换句话说,这两个函数只比较字母,不比较大小写;结果与
strcmp相同,如果结果>0,则表示string1>string2,结果==0,表示string1==string2,结果<0,表示string1<string2
示例:
#include "stdafx.h"
#include <string.h>
#include <stdio.h>
#include <Windows.h>
char string1[] = "The quick brown dog jumps over the lazy fox";
char string2[] = "The QUICK brown dog jumps over the lazy fox";
int _tmain(int argc, _TCHAR* argv[])
{
char tmp[20];
int result;
result = _stricmp( string1, string2 );
if( result > 0 )
strcpy( tmp, "greater than" );
else if( result < 0 )
strcpy( tmp, "less than" );
else
strcpy( tmp, "equal to" );
printf( "\t_stricmp: String 1 is %s string 2\n", tmp );
Sleep(10000);
return true;
}