自己写一个带可变参数的函数,然后这样处理
void testLog(char* fmt,...)
{
CString strLog;
va_list argp;
va_start(argp,fmt);
strLog.FormatV(fmt,argp);
va_end(argp);
AfxMessageBox(strLog);
}
void testLog(char* fmt,...)
{
CString strLog;
va_list argp;
va_start(argp,fmt);
strLog.FormatV(fmt,argp);
va_end(argp);
AfxMessageBox(strLog);
}
解决方案 »
- 我在用代码截屏时,游戏界面截出来是黑色的,怎么回事?有的截屏软件又能截出来,这是怎么实现的
- treectrl已经完成展开,和已经完成收缩这两个状态如何获取
- 请教CArray<CDataSocket*, CDataSocket*> m_DataSockets;
- 可以将对话框的窗口变成不见吗?只显示里边的位图?
- 如何选择录音源(Microphone或者LineIn),Win2000下可以执行的代码到98就无效。UP有分,不够开贴再加
- 怎样利用vc向单片机传数据,希望您伸出援助之手???
- 如何将WAV文件中指定开始、结束时间段的声音数据截成单独的文件?
- 求救,请问各位大虾,在一个软件如何实现不同的语言版本?并且在安装向导中加入中文版和英文版的选择?
- 压缩文件的格式问题!
- 一个小问题!!
- 请问在一个DLL基础上封装个DLL,想找人做多少钱可以开发?
- 哪位能介绍点关于VC中使用WebService的资料或书籍
#include <stdarg.h>void testit ( int i, ...)
{
va_list argptr;
va_start(argptr, i); if ( i == 0 ) {
int n = va_arg( argptr, int );
printf( "%d\n", n );
} else {
char *s = va_arg( argptr, char* );
printf( "%s\n", s);
}
}int main()
{
testit( 0, 0xFFFFFFFF ); // 1st problem: 0xffffffff is not an int
testit( 1, NULL ); // 2nd problem: NULL is not a char*
}
可以参考msdn上的例子,在msdn上收一下 va_list ,学习一下吧,可以解决你的问题。
static void __cdecl GetSQLStr(CStringA &strSQL, int count, ...)
{
if (i > 0) {
CStringA strCols = "";
CStringA strVals = "";
CStringA astrCol[] = { "ID", "S1", "S2" };
for (int i = 0; i < count; i++) {
if (i > 0) {
strVals += ",'%s'";
strCols += "," + astrCol[i];
} else {
strVals = "'%s'";
strCols = astrCol[0];
}
} CStringA strFmt = "INSERT INTO DB_TEST (" + strCols + ") VALUES (" + strVals + ")"; va_list vl = NULL;
va_start(vl, count);
strSQL.FormatV(strFmt, vl);
va_end(vl);
}
}int main(int argc, char *argv[])
{
CStringA strSQL;
GetSQLStr(strSQL, 1, s1);
GetSQLStr(strSQL, 2, s1, s2);
GetSQLStr(strSQL, 3, s1, s2, s3);
return 0;
}
va_start(argp,fmt);
strLog.FormatV(fmt,argp);
va_end(argp);与strSQL.Format("Insert into DB_TEST(ID,S1,S2) Values ('%s','%s','%s') ", s1,s2 ,s3 );相同效果:我的意思如何产生这种效果
strSQL.Format("Insert into DB_TEST(ID,S1,S2) Values ('%s','%s','%s') ", s1,+ s2 +,s3+...... ); 就是后面变化如何动态加上不是固定写,前面string可以用 string + string 方式后面,S1, S2,S3) 能不能用循环自动产生
strSQL.Format(str, s1,s2 );
strSQL.Format(str s1,s2 );
strSQL.Format(str, s1,s2 ,s3 );
以上三个变量三个赋值语句 能不能用一个循环完成后面哪怕有N个,
int S[N];
for(i=0; i<N; i++)
strSQL.Format(str, s[0],,,,); //自动生成后面变量的代码,,,代码自动化问题,????
int S[N];strSQL.Format(str, S[0], S[1] ....); //str 内容可增加,,S[N] 数据不定,但类型固定,,后面赋值,,数量能不能用循环来实现???
static void __cdecl FormatSQLStr(CStringA &strRetSQL, const CStringA &strSQLFmt, CStringA astrCol[], int count, ...)
{
if (count > 0) {
CStringA strCols = "";
CStringA strVals = "";
for (int i = 0; i < count; i++) {
if (i > 0) {
strVals += ",'%s'";
strCols += "," + astrCol[i];
} else {
strVals = "'%s'";
strCols = astrCol[0];
}
}
CStringA strRetFmt;
strRetFmt.Format(strSQLFmt, strCols, strVals);
va_list vl = NULL;
va_start(vl, count);
strRetSQL.FormatV(strRetFmt, vl);
va_end(vl);
}
}
CStringA strRetSQL[3];
CStringA astrCol[3] = { "ID", "S1", "S2" };
for (int i = 0; i < 3; i++) {
FormatSQLStr(strRetSQL[i], "INSERT INTO DB_TEST (%s) VALUES (%s)", astrCol, i + 1, s1, s2, s3);
}
最终 strRetSQL 这个数组应该能得到:
INSERT INTO DB_TEST ('ID') VALUES (s1的值)
INSERT INTO DB_TEST ('ID','S1') VALUES (s1的值,s2的值)
INSERT INTO DB_TEST ('ID','S1','S2') VALUES (s1的值,s2的值,s3的值)
代码未测试,可能需要修改。
例如: "Insert into DB_TEST(ID,S1,S2) Values ('%s','%s','%s') ", s1,s2 ,s3 );CString Field[]={"ID","S1","S2"}; //字段名称
CString strValue[]={"001","name","sex"}; //字段对应要传入的值
int max =3; //因为只有三组,插入更多,就相应增加
CString strSQL;strSQL = " "Insert into DB_TEST(";
for(int i=0; i<max; i++)
strSQL = strSQL + Field[i]; //第一部把三个字段名称传输完毕
strSQL =strSQL + ") Values ("; //第二部分把中间词填完for(int i=0; i<max; i++)
{
strSQL = strSQL +"'" +strValue[i] + "'"; //第三部把三个字段对应值传输完毕
if(i<max-1) strSQL = strSQL + ",";
}strSQL =strSQL + ") "; //第四部分,把最后)补上,,
=========================================================================
思路:
CString Field[]={"ID","S1","S2".....}; //字段名称
CString strValue[]={"001","name","sex".....}; //字段对应要传入的值int max=N; 只要有 N个增加值,还是用上面代码,从而实现SQL代码自动化,,,包括更新,查询等,,
CString Field[] ....等可用可变数组代替,大家看这个思路对吗????
CString strValue[]={"001","name","sex"}; //字段对应要传入的值
int max =3; //因为只有三组,插入更多,就相应增加
CString strSQL;strSQL = " "Insert into DB_TEST(";
for(int i=0; i<max; i++)
{
strSQL = strSQL + Field[i]; //第一部把三个字段名称传输完毕
if(i<max-1) strSQL = strSQL + ",";
}
strSQL =strSQL + ") Values ("; //第二部分把中间词填完for(int i=0; i<max; i++)
{
strSQL = strSQL +"'" +strValue[i] + "'"; //第三部把三个字段对应值传输完毕
if(i<max-1) strSQL = strSQL + ",";
}strSQL =strSQL + ") "; //第四部分,把最后)补上,,