我有若干的字符串,需要作为参数传递给函数,采用什么方法传递呢? 如题。比如“hello”“10086”“中华人民”“四川”“湖南”......等等下面是两个并行的思路,帮忙看看:1、用一个类似数组的变量可以吗?字符数组怎么实现呢?2、用cstringarray类可以实现吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 最好使用CStringArray,因为可以补丁长度而用数组做,你的若干个字符串,做动态数组太麻烦了,嘻嘻~个人意见 第一种方法:CString strArray[] = {“hello”,“10086”,“中华人民”,“四川”,“湖南” };或是 CString* strArray = new CString[5];然后挨个赋值 也可以。Func(CString* strArray/*字符串数组指针*/, int count/*字符串数组的个数*/)第二种:CStringArray当然也可以,本身就是包装了一下,成为一个动态数组而已Func(CStringArray& array); 1. 在win环境,还是用CStringArray,不用太多考虑。2. 如果不愿用,可以考虑链表,虽然麻烦点,但是实现完全由自己,可控性强。3. 数组的方法是最简单的,按照可能出现的字符串最大数值,开个足够的数组,比如2MB的,速度绝对够快,反正现在内存不值钱的。 这些方法都可以。我习惯用字符串指针数组:LPCTSTR Strings[] = {_T("hello"), _T("10086"), ……}; 为什么不试试std::vector呢?呵呵……CStringArray是在C++标准没出现前的东西,建议不使用哦。 如果数目不是太多,可以这样void fun(int count, ...) 如果这样:CStringArray csa;csa.SetSize(10);但是假如我只是用了其中的4个,那么其余6个是NULL吗?我在程序里面又怎么判断前4个是我需要的数据呢? LPCTSTR Strings[10]; CString str; for(int i=0;i<m_lstContent.GetCount ();i++) { m_lstContent.GetText (i,str); //MessageBox(str); Strings[i]=str; } MessageBox(Strings[2]);我在m_lstContent添加了几列,但是不能正确显示啊,乱码,什么问题啊? 用vector<string> VKS吧, 存字符串的时候vector<CString> v_buf;CString str;str = _T("abc");v_buf.pushback(str);str = _T("def");v_buf.pushback(str);用的时候for(int i = 0;i < v_buf.size();i++){ CString str = v_buf[i];}vector<CSstring> v_buf; //这么用可能会有警告但是不要紧没事的; 其实,最原始的反而最简单。function demo(const char** argv, int argc){ for(int i = 0; i <argc; i++) printf("%s", argv[i]);}const char** plist = {_T("hello"), _T("10086"), ……};demo(plist, COUNT); 超简单的例子,不用担心内存管理问题。#include <vector>std::vector<CString> strArray;strArray.pushback("张三");strArray.pushback("男");strArray.pushback("88");strArray.pushback("汉");strArray.pushback("备注:vector比较好用!");void fun(std::vector<CString>& strSome){ for(UINT i = 0; i < strSome.size(); i++) { MessageBox( strSome[i] ); }} 支持用Vector的朋友们,尽量用C++标准模版库(STL)里面的类,具体用法可以查阅MSDN的例子,看一看,很快就明白 用Vector吧,你的这些字符串没什么联系,不然用结构体很不错。 谢谢大家,我打算使用CStringArray,但是遇到了些问题.我的部分代码:线程函数(要完成的功能:检索一个文件夹的文件,文件名中含有我关心的名字的时候,我把它移动到指定的文件夹,下面的代码并不是最终代码):UINT CfProcThread(LPVOID param){ CStringArray *csa=((CFPARA*)param)->keyAndDir ; AfxMessageBox(csa->GetAt (1)); //AfxMessageBox(csa->GetAt (0)); return 1;}主函数创建线程:(其中csa是一个CStringArray类型变量,内容已经设置好,但是现在传递不到线程啊!!)CFPARA* cfPara=new CFPARA;cfPara->sdir =sCheck;cfPara->hwnd =m_hWnd;cfPara->keyAndDir =&csa;cfPara->lpWnd =this;AfxBeginThread(CfProcThread,(LPVOID)cfPara);自定义的结构体:struct CFPARA{ CString sdir;//=_T(""); CStringArray *keyAndDir;//=_T(""); HWND hwnd; //int i; //BOOL bEnableExit; LPVOID lpWnd;};现在的问题是,CStringArray 变量csa传递不到线程函数,急死我了!帮帮忙吧高手们!我的思路:1. 是不是csa作为数组需要传递地址?在结构体中定义CStringArray指针?试了,可是不理想.2. "="操作符不能用于CStringArray,那么是不是有两个CStringArray变量传递的方法(不用指针)? 其实,怎么做都是方法 方便使用就好,也可以构造一个xml呀做一个xml解析就好, 而且信息可以不固定,内容也可区分 <persion> <info> <name>hello</name> <tel>10086</tel> ....... ... </info> <info> <name>hello2</name> <tel>10087</tel> </info> ..... ... </persion> 直接使用CStringArray即可操作简单,添加和取值只需要使用Add和GetAt方法在传递参数的时候可以直接使用引用类型传递到要使用的地方根据位置使用GetAt就可以取到字符串了传递到线程的时候最好把线程体的参数结构参数 CStringArray用单元,不要用指针两个CStringArray相互赋值可以使用Copy方法比如CStringArray a,b;a.Add("你好");a.Add("hello");b.Copy(a) 在传递参数之前,可以使用Copy方法给 keyAddDir赋值 确保csa的生命周期足够长,不要在线程完结之前就出栈了 使用了cstring 数组来实现的.传递过去以后,用了一个循环把它传递给了线程里面的一个cstring数组,成功了.cstringarray使用起来不太顺,报一个断言有问题,查了,说在内存分配的时候大小-1,不能分到内存空间,不知道什么原因,由于着急把程序写完,就用了cstring数组,谢谢大家了!! 自绘控件接收不到WM_LBUTTONDOWN消息,各位帮忙看下 是否需要#include "Resource.h" 子进城继承的SOCKET句柄发送数据时返回WSAEAFNOSUPPORT错误 我这样给一个CStatic设置文本怎么不对啊? VC下作个界面,能在自己的界面里打开word文档,改怎么作啊? _com_util::ConvertBSTRToString如何使用 怎样注册进程为服务器进程?(详细操作)大给分. 双缓存和半透明 高分求教基于IE内核浏览器的FLASH插件如何加载 请推荐几本VC网络编程的书 如何用程序改文件名? 问一个关于资源的问题
而用数组做,你的若干个字符串,做动态数组太麻烦了,嘻嘻~个人意见
CString strArray[] = {“hello”,“10086”,“中华人民”,“四川”,“湖南” };
或是 CString* strArray = new CString[5];然后挨个赋值 也可以。
Func(CString* strArray/*字符串数组指针*/, int count/*字符串数组的个数*/)第二种:
CStringArray当然也可以,本身就是包装了一下,成为一个动态数组而已
Func(CStringArray& array);
LPCTSTR Strings[] = {_T("hello"), _T("10086"), ……};
void fun(int count, ...)
CStringArray csa;
csa.SetSize(10);
但是假如我只是用了其中的4个,那么其余6个是NULL吗?我在程序里面又怎么判断前4个是我需要的数据呢?
CString str;
for(int i=0;i<m_lstContent.GetCount ();i++)
{
m_lstContent.GetText (i,str);
//MessageBox(str);
Strings[i]=str;
}
MessageBox(Strings[2]);
我在m_lstContent添加了几列,但是不能正确显示啊,乱码,什么问题啊?
vector<CString> v_buf;
CString str;
str = _T("abc");
v_buf.pushback(str);
str = _T("def");
v_buf.pushback(str);
用的时候
for(int i = 0;i < v_buf.size();i++)
{
CString str = v_buf[i];
}vector<CSstring> v_buf; //这么用可能会有警告但是不要紧没事的;
{
for(int i = 0; i <argc; i++)
printf("%s", argv[i]);
}
const char** plist = {_T("hello"), _T("10086"), ……};demo(plist, COUNT);
strArray.pushback("男");
strArray.pushback("88");
strArray.pushback("汉");
strArray.pushback("备注:vector比较好用!");void fun(std::vector<CString>& strSome)
{
for(UINT i = 0; i < strSome.size(); i++)
{
MessageBox( strSome[i] );
}
}
我的部分代码:
线程函数(要完成的功能:检索一个文件夹的文件,文件名中含有我关心的名字的时候,我把它移动到指定的文件夹,下面的代码并不是最终代码):
UINT CfProcThread(LPVOID param)
{
CStringArray *csa=((CFPARA*)param)->keyAndDir ;
AfxMessageBox(csa->GetAt (1));
//AfxMessageBox(csa->GetAt (0));
return 1;
}
主函数创建线程:(其中csa是一个CStringArray类型变量,内容已经设置好,但是现在传递不到线程啊!!)
CFPARA* cfPara=new CFPARA;
cfPara->sdir =sCheck;
cfPara->hwnd =m_hWnd;
cfPara->keyAndDir =&csa;
cfPara->lpWnd =this;
AfxBeginThread(CfProcThread,(LPVOID)cfPara);自定义的结构体:
struct CFPARA
{
CString sdir;//=_T("");
CStringArray *keyAndDir;//=_T("");
HWND hwnd;
//int i;
//BOOL bEnableExit;
LPVOID lpWnd;
};现在的问题是,CStringArray 变量csa传递不到线程函数,急死我了!帮帮忙吧高手们!
我的思路:
1. 是不是csa作为数组需要传递地址?在结构体中定义CStringArray指针?试了,可是不理想.
2. "="操作符不能用于CStringArray,那么是不是有两个CStringArray变量传递的方法(不用指针)?
方便使用就好,也可以构造一个xml呀
做一个xml解析就好, 而且信息可以不固定,内容也可区分
<persion>
<info>
<name>hello</name>
<tel>10086</tel>
.......
...
</info>
<info>
<name>hello2</name>
<tel>10087</tel>
</info>
.....
...
</persion>
传递到要使用的地方根据位置使用GetAt就可以取到字符串了
传递到线程的时候最好把线程体的参数结构参数 CStringArray用单元,不要用指针两个CStringArray相互赋值可以使用Copy方法比如CStringArray a,b;
a.Add("你好");
a.Add("hello");b.Copy(a)
在传递参数之前,可以使用Copy方法给 keyAddDir赋值
cstringarray使用起来不太顺,报一个断言有问题,查了,说在内存分配的时候大小-1,不能分到内存空间,不知道什么原因,由于着急把程序写完,就用了cstring数组,谢谢大家了!!