上海今天下雨了,湿湿漉漉的相当的犯淫,哥今天又木带伞,一般的小雨根本阻挡不了俺们山东纯爷们,看到街上的女人穿着暴露的扭来扭去,哥真想过去给她们取取暖,大冷天也出来骚扰也们的眼球,要腚不要命啊。
第二章最后就两个内容,第一个,sprintf及其扩展,第二个,一段稍微增强点的MessageBox代码。
第一个,sprintf及其扩展。
知道怎么用是一码事,知道为什么用是另外一码事,这不是广大老爷们泡妞,追求关上灯一般都行的境界,一个大型软件在编写的时候一般要求严格,比如我所在Team开发的软件,持续不断30年,历经无数淫手修改添加,所以不知道为什么用是很可怕的事情,就算他娘的自己觉得这样写很牛B,但只要跟先前的标准不一样,review的时候肯定会被追问为何这样写,他娘的,这着实是很苦闷的事,当然,如果不矫情,就写个“hello world”类似的操蛋程序,你随便巴拉脚丫子都没人管。
sorry,上一段我意淫太多了,sprintf,是个c语言函数,用来格式化字符串,有哥们可能说,驴踢了啊,直接printf不就好了啊,按李云龙的说法你丫真是个乡下人.
比如现在int numF=1; int numS=2;要你在控制台输出"numF + numS = 3", 你直接用
printf("numF + numS = %d",numF+numS);操,这样写完全很浪荡很完美。但如果现在老子不在控制台输出,毕竟那玩意在黑框框里鼠标标闪闪滴没人喜欢,我就要求你组成一个字符串char* numSum="numF + numS = 3",其中3要用numF + numS得出,你丫怎么搞?你咋搞?咋搞嘛?这就是sprintf的拿手菜。
sprintf,功能是把格式化的数据写入某个字符串中,参数说白了有三部分,第一部分,字符存储部分,第二部分,格式化部分,第三部分,替换第二部分中参数的数据部分。
char numSum[15];
sprintf(numSum, "numF + numS = %d",numF+numS);
就是这个叼样,sprintf还有个表妹,专门格式化时间的strftime,这以后用到再说。
好了,问题来了,咱们讲的是啥?windows编程,丫的上半部分都是说的sprintf,当然这在windows中也能用,不然你咋在你丫盗版的Visual Studio2005,2008。。。中写C码子,但windows毕竟有自己与之对应的函数,除了这些,上一次也说了,还他娘的分ASCII和UNICODE版本,都不同,要是这样也就算了,还他娘的有通用版本,要我说操这些蛋干嘛,直接一个通用版不就完事了嘛,哎。。
下面是个对照,其实我建议,只记住通用版就好了,两不得罪。
C语言(ASCII) C语言(UNICODE) C语言(通用)
sprintf swprintf stprintf
windows(ASCII) windows(UNICODE) windows(通用)
wsprintfA wsprintfW wsprintf
我觉得能记住sprintf, stprintf 和wsprintf就不错了.
作为一个吊死程序员,我深信人无完人,码无完码,sprintf是不错,但是第一个参数,不完美啊,容易越界,于是又制造出来一个也是操蛋的不是完美的函数int snprintf(char *str, size_t size, const char *format, ...);
这个函数跟sprintf长的只有一个区别,多了一个size_t size,这个函数比sprintf强在哪呢?
(1) 如果格式化后的字符串长度 < size,则将此字符串全部复制到str中,并给其后添加一个字符串结束符('\0');
snprintf snwprintf sntprintf
这个函数也有windows版_snprintf,但这个跟上面的不太一样,比如>=size的是时候后面不自动添加('\0'),这里就不多说了,反正C语言在winows也能用,所以用上面三个比较好。
下面再看一段码子。
#include <windows.h> #include <TCHAR.H> int CDECL MessageBoxPrintf(TCHAR* szCaption, TCHAR* szFormat,...) { TCHAR szBuffer[1024]; va_list pArgList; va_start(pArgList, szFormat);
_vsntprintf(szBuffer, sizeof(szBuffer)/sizeof(TCHAR), szFormat, pArgList);
va_end(pArgList); return MessageBox(NULL, szBuffer, szCaption, 0); } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { int iScreenSizeX = GetSystemMetrics(SM_CXSCREEN); int iScreenSizeY = GetSystemMetrics(SM_CYSCREEN); MessageBoxPrintf(TEXT("Screen Size"), TEXT("The Screen is %d pixels wide by %d pixels high."), iScreenSizeX, iScreenSizeY); return 0; }
#include <windows.h>
#include <TCHAR.H>
int CDECL MessageBoxPrintf(TCHAR* szCaption, TCHAR* szFormat,...)
{
TCHAR szBuffer[1024];
va_list pArgList;
va_start(pArgList, szFormat);
_vsntprintf(szBuffer, sizeof(szBuffer)/sizeof(TCHAR), szFormat, pArgList);
va_end(pArgList);
return MessageBox(NULL, szBuffer, szCaption, 0);
}
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR szCmdLine,
int iCmdShow)
{
int iScreenSizeX = GetSystemMetrics(SM_CXSCREEN);
int iScreenSizeY = GetSystemMetrics(SM_CYSCREEN);
MessageBoxPrintf(TEXT("Screen Size"), TEXT("The Screen is %d pixels wide by %d pixels high."), iScreenSizeX, iScreenSizeY);
return 0;
}
// #include <windows.h>windows
//#include <TCHAR.H>_vsntprintf
//
//int CDECL MessageBoxPrintf(TCHAR* szCaption, TCHAR* szFormat,...)
//
//CDECL ,WINAPI
//WINAPICDECLMessageBoxPrintf
//WinMainMessageBoxPrintf(TEXT("Screen Size"), TEXT("The Screen is %d pixels wide by %d pixels high."), iScreenSizeX, iScreenSizeY);
//
//(TCHAR* szCaption, TCHAR* szFormat,...)6
//TCHAR* szCaption, TCHAR* szFormatTCHAR*LPTSTRPTSTR
// MessageBoxPrintf_vsntprintf
//va_list va_start, va_arg, va_end ,CFILEfopenfseek fclose
//va_listFILEva_start
//
//va_startva_listva_arg
//va_end
//va_list,va_start,va_arg,_va_end
//va_listX.
//va_startX,,.
//va_argva_argva_arg.
//va_end.