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