string Format相关

string相关

1.Format
void __cdecl Format( _Printf_format_string_ UINT nFormatID, ... )
 {
  using namespace ATL;
  CStringT strFormat( GetManager() );
  ATLENSURE( strFormat.LoadString( nFormatID ) );

  va_list argList;
  va_start( argList, nFormatID );
  
  ThisType tmp;
  tmp.FormatV( strFormat, argList );
  *this = tmp;

  va_end( argList );
 }
va_start详细
/*  基本过程:
      va_list arglist; //声明一个变量来转换参数列表

  va_start(arglist,format); //初始化变量

  va_end(arglist); //结束变量列表,和va_start成对使用

  可以根据va_arg(arglist,type)取出参数 其中type可以是int,char等等

或  va_start(arglist, format);
     status = vsnprintf(buf, 1024, format, arglist);  //有些编译器要求写成_vsnprintf

     va_end(arglist);

    vsnprintf()函数:
    int vsnprintf (char *s, size_t size, const char *template, va_list ap)
       本函数跟snprintf函数很类似,只是将参数的数目可变的,变成了一个指针的列表。
   */
#include <stdio.h>
#include <stdarg.h>
void simple_va_fun(int start, ...)
{
    va_list arg_ptr;
    int nArgValue =start;
    int nArgCout=0;      
    va_start(arg_ptr,start);

    do
    {
        ++nArgCout;
        printf("the %d th arg: %d/n",nArgCout,nArgValue);   
        nArgValue = va_arg(arg_ptr,int);     //指针指向下一个参数                
    } while(nArgValue != -1);
    return;
}
int main(int argc, char* argv[])
{
    simple_va_fun(100,-1);
    simple_va_fun(100,200,-1);
    return 0;
}

/*输出结果:the 1 th arg: 100
the 1 th arg: 100
the 2 th arg: 200

*/

snprintf函数说明
int snprintf(char *restrict buf, size_t n, const char * restrict  format, ...);

函数说明:最多从源串中拷贝n-1个字符到目标串中,然后再在后面加一个0。所以如果目标串的大小为n

                 的话,将不会溢出。

函数返回值:若成功则返回欲写入的字符串长度,若出错则返回负值。

Result1(推荐的用法)

#include <stdio.h>
#include <stdlib.h>

int main()
{
     char str[10]={0,};
     snprintf(str, sizeof(str), "0123456789012345678");
     printf("str=%s/n", str);
     return 0;
}


root] /root/lindatest
$ ./test
str=012345678

 

Result2:(不推荐使用)

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char str[10]={0, };
    snprintf(str, 18, "0123456789012345678");
    printf("str=%s/n", str);
    return 0;
}


root] /root/lindatest
$ ./test
str=01234567890123456

 

snprintf函数返回值的测试:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char str1[10] ={0, };
    char str2[10] ={0, };
    int ret1=0,ret2=0;
    ret1=snprintf(str1, sizeof(str1), "%s", "abc");
    ret2=snprintf(str2, 4, "%s", "aaabbbccc");
    printf("aaabbbccc length=%d/n", strlen("aaabbbccc"));
    printf("str1=%s,ret1=%d/n", str1, ret1);
    printf("str2=%s,ret2=%d/n", str2, ret2);
    return 0;
}

[root] /root/lindatest
$ ./test
aaabbbccc length=9
str1=abc,ret1=3
str2=aaa,ret2=9
 
MAKEINTRESOURCE   的作用:  
  是把一个"数字形ID",转化为"字符串".但是执行前后,输入的数据的内容和长度是不变的!它只不过就是C语言里面"强制类型转换"而已.  
   
  请看   Winuser.h   代码:  
  #define   MAKEINTRESOURCEA(i)   (LPSTR)((DWORD)((WORD)(i)))  
  #define   MAKEINTRESOURCEW(i)   (LPWSTR)((DWORD)((WORD)(i)))  
  #ifdef   UNICODE  
  #define   MAKEINTRESOURCE     MAKEINTRESOURCEW  
  #else  
  #define   MAKEINTRESOURCE     MAKEINTRESOURCEA  
  #endif   //   !UNICODE  
   
  现在,再来归纳它的用法.就用FindResource来说明.(这个函数与MFC的AfxFindResourceHandle)  
   
  HRSRC   FindResource(  
      HMODULE   hModule,   //   module   handle  
      LPCTSTR   lpName,     //   resource   name  
      LPCTSTR   lpType       //   resource   type  
  );  
   
  就是lpName参数需要使用MAKEINTRESOURCE   ,因为它需要LPCTSTR类型的参数输入.那么,情况就很清楚了.凡设计"资源"的API或者MFC类,在参数类型为LPCTSTR时,就应该使用MAKEINTRESOURCE   .这是针对"资源名字"为"数字类型"时的情况.  
   
  但是,当你使用的资源没有数字ID,而仅仅是用"字符串"来识别的话,就直接把这个标识资源名字的"字符串"当做参数传入,而不必使用MAKEINTRESOURCE   了


FindResource

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值