【C/C++】sprintf中如何将容器作为可变参数列表传入
2011-03-03 00:00
507 查看
近日做脚本接口时遇到一个变参的传入接口,因为我们游戏中的脚本系统是自定义的,这个接口的参数因为是可变,所以将参数读进来存入一个Vector容器中,然后利用Sprintf格式化之后发送给客户端做逻辑,以前的做法就是switch…case…这个容器中元素的个数,然后sprintf( szBuff, nBuffSize – 1, szFormat, vtVar[0], vtVar[1], ……),而如今要变参,这样的方法肯定是行不通了,想了一下截取字符串的方法存入,尝试了一下,是可以行得通的,与大家分享一下代码。
希望大家有更好的方法可以交流,谢谢!
C
#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
void ScriptSprintf( char* szBuf, int nBufSize, const char* szText,
const std::vector<std::string>& vtVar )
{
string strTemp(szText);
const char* szSpn = "%s";
int nBeginPos = 0;
int nEndPos = 0;
string strSub;
if ( vtVar.empty() )
{
strncpy_s( szBuf, nBufSize - 1, szText, nBufSize - 1);
return;
}
std::vector<string>::const_iterator iterBegin = vtVar.begin();
std::vector<string>::const_iterator iterEnd = vtVar.end();
for ( ; iterBegin != iterEnd; ++iterBegin )
{// 容器元素的操作建议还是使用迭代器,因为vtVar为const,所以迭代器为const_iterator
strSub.clear();
nEndPos = strTemp.find(szSpn);
if ( nEndPos != strTemp.length() ) // 找到了%s
{
strSub = strTemp.substr(nBeginPos, nEndPos - nBeginPos + 2); // 截取前面的字串XXX%s
strTemp = strTemp.substr(nEndPos + 2, strTemp.length() - nEndPos - 2); // 缩短strTemp
// 特别注意此处的strlen,他可以将字串往后加
sprintf( szBuf + strlen(szBuf), strSub.c_str(), iterBegin->c_str() ); // 按格式存入
}
}
if ( !strTemp.empty() )
{// 如果为XXX%sYYY,%s以前的字串前面已经处理过,剩余的字串还需要拼起来
strncpy( szBuf, strTemp.c_str(), strTemp.length() );
}
}
int _tmain(int argc, _TCHAR* argv[])
{
char szBuf[1024] = {0};
const char* szText = "AAA%sBBB%sCCC%sDDD%sEEE%s";
std::vector<std::string> vtVar;
vtVar.push_back("1");
vtVar.push_back("2");
vtVar.push_back("3");
vtVar.push_back("4");
vtVar.push_back("5");
ScriptSprintf(szBuf, 1023, szText, vtVar);
cout<<szBuf<<endl;
system("pause");
return 0;
}
希望大家有更好的方法可以交流,谢谢!
C
#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
void ScriptSprintf( char* szBuf, int nBufSize, const char* szText,
const std::vector<std::string>& vtVar )
{
string strTemp(szText);
const char* szSpn = "%s";
int nBeginPos = 0;
int nEndPos = 0;
string strSub;
if ( vtVar.empty() )
{
strncpy_s( szBuf, nBufSize - 1, szText, nBufSize - 1);
return;
}
std::vector<string>::const_iterator iterBegin = vtVar.begin();
std::vector<string>::const_iterator iterEnd = vtVar.end();
for ( ; iterBegin != iterEnd; ++iterBegin )
{// 容器元素的操作建议还是使用迭代器,因为vtVar为const,所以迭代器为const_iterator
strSub.clear();
nEndPos = strTemp.find(szSpn);
if ( nEndPos != strTemp.length() ) // 找到了%s
{
strSub = strTemp.substr(nBeginPos, nEndPos - nBeginPos + 2); // 截取前面的字串XXX%s
strTemp = strTemp.substr(nEndPos + 2, strTemp.length() - nEndPos - 2); // 缩短strTemp
// 特别注意此处的strlen,他可以将字串往后加
sprintf( szBuf + strlen(szBuf), strSub.c_str(), iterBegin->c_str() ); // 按格式存入
}
}
if ( !strTemp.empty() )
{// 如果为XXX%sYYY,%s以前的字串前面已经处理过,剩余的字串还需要拼起来
strncpy( szBuf, strTemp.c_str(), strTemp.length() );
}
}
int _tmain(int argc, _TCHAR* argv[])
{
char szBuf[1024] = {0};
const char* szText = "AAA%sBBB%sCCC%sDDD%sEEE%s";
std::vector<std::string> vtVar;
vtVar.push_back("1");
vtVar.push_back("2");
vtVar.push_back("3");
vtVar.push_back("4");
vtVar.push_back("5");
ScriptSprintf(szBuf, 1023, szText, vtVar);
cout<<szBuf<<endl;
system("pause");
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | #include <stdio.h> #include <iostream> #include <vector> using namespace std; void ScriptSprintf( char* szBuf, int nBufSize, const char* szText, const std::vector<std::string>& vtVar ) { string strTemp(szText); const char* szSpn = "%s"; int nBeginPos = 0; int nEndPos = 0; string strSub; if ( vtVar.empty() ) { strncpy_s( szBuf, nBufSize - 1, szText, nBufSize - 1); return; } std::vector<string>::const_iterator iterBegin = vtVar.begin(); std::vector<string>::const_iterator iterEnd = vtVar.end(); for ( ; iterBegin != iterEnd; ++iterBegin ) {// 容器元素的操作建议还是使用迭代器,因为vtVar为const,所以迭代器为const_iterator strSub.clear(); nEndPos = strTemp.find(szSpn); if ( nEndPos != strTemp.length() ) // 找到了%s { strSub = strTemp.substr(nBeginPos, nEndPos - nBeginPos + 2); // 截取前面的字串XXX%s strTemp = strTemp.substr(nEndPos + 2, strTemp.length() - nEndPos - 2); // 缩短strTemp // 特别注意此处的strlen,他可以将字串往后加 sprintf( szBuf + strlen(szBuf), strSub.c_str(), iterBegin->c_str() ); // 按格式存入 } } if ( !strTemp.empty() ) {// 如果为XXX%sYYY,%s以前的字串前面已经处理过,剩余的字串还需要拼起来 strncpy( szBuf, strTemp.c_str(), strTemp.length() ); } } int _tmain(int argc, _TCHAR* argv[]) { char szBuf[1024] = {0}; const char* szText = "AAA%sBBB%sCCC%sDDD%sEEE%s"; std::vector<std::string> vtVar; vtVar.push_back("1"); vtVar.push_back("2"); vtVar.push_back("3"); vtVar.push_back("4"); vtVar.push_back("5"); ScriptSprintf(szBuf, 1023, szText, vtVar); cout<<szBuf<<endl; system("pause"); return 0; } |
相关文章推荐
- 元旦快乐,阖家团圆,幸福安康.C#重载示例(有问重载该如何选择?在C#中可很方便地在智能感知弹出中选择不同参数列表进行使用;不像C/C++那样,要记住编译器自动选择最佳匹配参数列表的概念)
- Effective JavaScript Item 21 使用apply方法调用函数以传入可变参数列表
- Python中如何使用*args 和 **kwargs (非keyworded,可变长度参数列表 keyworded形式可变长度的参数列表)
- 如何将二位数组作为参数传入函数。
- C++.net 定义类 将类对象作为函数参数传入另一个类 出现错误
- C++ 中如何用 vector类作为函数的参数
- oracle如何把得到的值作为参数传入到 sql中
- C++可变参数列表处理宏va_list、va_start、va_end的使用
- C++可变参数列表处理宏va_list、va_start、va_end的使用
- C++ 中如何用 vector类作为函数的参数
- c++ 成员函数作为函数指针参数传入
- c++ 成员函数作为函数指针参数传入
- C++(笔记)容器(vector)作为函数参数如何传参
- c++ 调用 python 实例 涉及 类 多参数 列表作为参数
- C++ 中如何用 vector类作为函数的参数
- 关于ibatis如何传入数组作为参数
- c++ 可变参数自定义print c/c++如何写一个带可变参数的函数
- C++如何将N维数组作为参数动态传给方法
- C++实现可变参数列表
- 【转】C++可变参数列表处理宏va_list、va_start、va_end的使用