数组指针';s向量c++; 我是C++新手,我在检查扫描器项目,我用的是扫描仪提供的API。这是我的密码:
.h文件:数组指针';s向量c++; 我是C++新手,我在检查扫描器项目,我用的是扫描仪提供的API。这是我的密码:,c++,visual-c++,C++,Visual C++,.h文件: #include <iostream> #include<Windows.h> #include<vector> using namespace std; class Excella { public: vector<char*> getDevicesName(); }; #包括 #包括 #包括 使用名称空间std; 埃克塞拉班 { 公众: 向量getDeviceName(); }; .cpp文件: vector&
#include <iostream>
#include<Windows.h>
#include<vector>
using namespace std;
class Excella
{
public:
vector<char*> getDevicesName();
};
#包括
#包括
#包括
使用名称空间std;
埃克塞拉班
{
公众:
向量getDeviceName();
};
.cpp文件:
vector<char*> Excella::getDevicesName()
{
DWORD dwResult;
vector<char*> listeDevices;
char pcDevName[128]="";
int i = 6;
// the device's name is stored in the variable 'pcDevName'
while ((dwResult = MTMICRGetDevice(i, (char*)pcDevName)) != MICR_ST_DEVICE_NOT_FOUND) {
dwResult = MTMICRGetDevice(i, (char*)pcDevName);
i++;
listeDevices.push_back((char*) pcDevName);
}
return listeDevices;
}
向量Excella::GetDeviceName()
{
德沃德结果;
矢量控制装置;
char pcDevName[128]=“”;
int i=6;
//设备名称存储在变量“pcDevName”中
而((dwResult=mtmicargetdevice(i,(char*)pcDevName))!=MICR\u ST\u设备未找到){
dwResult=MTMIRGETEVENT(i,(char*)pcDevName);
i++;
listeDevices.push_back((char*)pcDevName);
}
返回装置;
}
main.cpp
vector<char*> liste = excella.getDevicesName();
if (liste.empty()!= true)
{
for (vector<char*>::iterator IterateurListe = liste.begin(); IterateurListe != liste.end(); ++IterateurListe)
{ string str(*IterateurListe);
auto managed = gcnew String(str.c_str());
devices->Items->Add(managed);
}
}
else {
MessageBox::Show("The vector is empty");
}
vector liste=excella.getDeviceName();
if(liste.empty()!=true)
{
对于(vector::iterator IterateurListe=liste.begin();IterateurListe!=liste.end();++IterateurListe)
{string str(*IterateurListe);
自动管理=gcnewstring(str.c_str());
设备->项目->添加(管理);
}
}
否则{
MessageBox::Show(“向量为空”);
}
问题是我能得到正确的设备号。。我只是有一些奇怪的角色
谢谢你的帮助。这并不奇怪
char-pcDevName[128]=“”
将在函数vector Excella::GetDeviceName()
结束时超出范围。因此,任何指向向量的指针都将不再有效。从形式上讲,程序的行为是未定义的
使用std::vector
要简单得多。值得注意的是,这是您必须进行的唯一更改:push_back((char*)pcDevName)
将获取pcDevName
的值副本(这就是std::string
构造函数的工作方式)。不过,删除不必要的(char*)
强制转换。这并不奇怪
char-pcDevName[128]=“”
将在函数vector Excella::GetDeviceName()
结束时超出范围。因此,任何指向向量的指针都将不再有效。从形式上讲,程序的行为是未定义的
使用std::vector
要简单得多。值得注意的是,这是您必须进行的唯一更改:push_back((char*)pcDevName)
将获取pcDevName
的值副本(这就是std::string
构造函数的工作方式)。删除不必要的(char*)
强制转换。此处:
listeDevices.push_back((char*) pcDevName);
您正在将指向堆栈数组的指针推入ListDevices。这个函数有两个问题,一个是一旦getDeviceName函数结束,这些指针就无效,并且它们的使用是未定义的,另一个是在循环的每次迭代中都会覆盖pcDevName和存储的指针内容
您应该做的是让ListDevices存储std::string,即std::vector
,然后您可以使用ListDevices.push_back((char*)pcDevName)编码>将您的姓名安全地存储在矢量中。此处:
listeDevices.push_back((char*) pcDevName);
您正在将指向堆栈数组的指针推入ListDevices。这个函数有两个问题,一个是一旦getDeviceName函数结束,这些指针就无效,并且它们的使用是未定义的,另一个是在循环的每次迭代中都会覆盖pcDevName和存储的指针内容
您应该做的是让ListDevices存储std::string,即std::vector
,然后您可以使用ListDevices.push_back((char*)pcDevName)
将您的姓名安全地存储在向量中。您能再详细一点吗?你得到了什么样的奇怪字符?对于一个pcDevName
已经是char*
的字符,所以去掉不需要的char*
类型。对于两个,在将pcDevName
推到向量中之前,你从不检查dwResult
的结果以确保`mtmicargetdevice
成功;如果失败,这将解释为什么会看到未初始化的垃圾。对于三个循环,pcDevName
应该重新初始化每个循环,而不是重复使用;它可以拯救生命。你能再详细一点吗?你得到了什么样的奇怪字符?对于一个pcDevName
已经是char*
的字符,所以去掉不需要的char*
类型。对于两个,在将pcDevName
推到向量中之前,你从不检查dwResult
的结果以确保`mtmicargetdevice
成功;如果失败,这将解释为什么会看到未初始化的垃圾。对于三个循环,pcDevName
应该重新初始化每个循环,而不是重复使用;它拯救了生命。