Quantcast
Channel: CSDN博客推荐文章
Viewing all articles
Browse latest Browse all 35570

windows 程序设计 第二章(序)

$
0
0

      上海今天下雨了,湿湿漉漉的相当的犯淫,哥今天又木带伞,一般的小雨根本阻挡不了俺们山东纯爷们,看到街上的女人穿着暴露的扭来扭去,哥真想过去给她们取取暖,大冷天也出来骚扰也们的眼球,要腚不要命啊。

      第二章最后就两个内容,第一个,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');

               (2) 如果格式化后的字符串长度 >= size,则只将其中的(size-1)个字符复制到str中,并给其后添加一个字符串结束符('\0'),返回值为格式化后的字符串的长度。
 
我承认上两条我是抄的百度,因为我也是想这么解释的。之所以说这个也不完美,是因为,难道格式化后的字符串长度 >= size,后面的字符就不要了? 这显然不合理,但是你自己可以设定。跟sprintf一样,此函数也是几个版本,如下:
      C语言(ASCII)  C语言(UNICODE)   C语言(通用)   

                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.

 

 

                 

 

 

 

作者:ZHANGJIXIN 发表于2013-5-18 11:46:24 原文链接
阅读:10 评论:0 查看评论

Viewing all articles
Browse latest Browse all 35570

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>