数组指针';s向量c++; 我是C++新手,我在检查扫描器项目,我用的是扫描仪提供的API。这是我的密码:

数组指针';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&

.h文件:

#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
应该重新初始化每个循环,而不是重复使用;它拯救了生命。