C++ 将字符串中的十进制转换为二进制时出错

C++ 将字符串中的十进制转换为二进制时出错,c++,parsing,binary,bitset,C++,Parsing,Binary,Bitset,我编写了一个解析器,它以以下类型的格式读取文本文件: a r3, r2, r1 ah r8, r5, r6, r7 ai r10, i10, r127 r的数字可以更改,初始字符也可以更改。基本上,解析器所做的是基于初始字符(a、ah等),它将定义一个操作码值,然后解析寄存器号并将其转换为二进制。它将所有这些值连接在一起,创建一个32位长的二进制指令字符串,并将其输出到文本文件 在测试时,我遇到了一个错误 这是我的密码: #include <iostream> #include &

我编写了一个解析器,它以以下类型的格式读取文本文件:

a r3, r2, r1
ah r8, r5, r6, r7
ai r10, i10, r127
r的数字可以更改,初始字符也可以更改。基本上,解析器所做的是基于初始字符(a、ah等),它将定义一个操作码值,然后解析寄存器号并将其转换为二进制。它将所有这些值连接在一起,创建一个32位长的二进制指令字符串,并将其输出到文本文件

在测试时,我遇到了一个错误

这是我的密码:

#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <vector>
#include <bitset>
using namespace std;

void main()
{
    string instruction, input, OpCode;
    int i = 0;
    int format = 0;
    vector<string> myString;
    ifstream inFile;
    inFile.open("myfile.txt");

    //format 1 -> input: syntax/rt/ra/rb     output -> opcode/rb/ra/rt
    //format 2 -> input: syntax/rt/ra/rb/rc  output -> opcode/rt/rb/ra/rc
    //format 3 -> input: syntax/rt/ra        output -> opcode/i7/ra/rt
    //format 4 -> input: syntax/rt/ra        output -> opcode/i10/ra/rt
    //format 5 -> input: syntax/rt           output -> opcode/i16/rt

    if (inFile.is_open()){
        cout << "test" << endl;
        //Read until no more lines in text file to read
        while (getline(inFile, input))
        {
            istringstream ss(input);
            string token;

            //Get the instruction token
            getline(ss, token, ' ');
            instruction = token;

            //ADD WORD
            if (instruction == "a"){
                OpCode = "00011000000";
                format = 1;
            }

            if (format == 1){
                // Seperate the registers
                //We have RA, RB, AND RT
                //Convert the values into binary
                string value;
                while (getline(ss, token, ',')){
                    ss.ignore();
                    token.erase(0, 1); //Remove the "r" or "i" character from each string/register              
                    myString.push_back(token);
                }

                for (int j = 0; j < myString.size(); j++)
                {
                    cout << myString[j] << endl;
                    value = bitset<8>(myString[j]).to_string();
                    cout << value << endl;
                    OpCode = OpCode + value;
                    cout << OpCode << endl;
                }
            }


        }

    }
    system("pause");
}
它应该做的是看到指令是
a
,因此
OpCode
被设置,它将继续解析
r3、r2、r1
。它将删除
r
,并将3、2和1转换为其二进制值,并将其放入与操作码相连的字符串中,以形成32位长的指令。我遇到的问题是
value=bitsetmyString[j])to_string()。Visual studio在调试时引发以下错误:

< > >代码>汇编语言中的0x77 12C52F中未处理的异常:微软C++异常:STD::内存位置0x00 39 F110的无效地址。< /代码> < / P> 我不知道该怎么办。它给了我中断或继续的选择。如果我继续,它将把3转换成00000000。在下一次迭代中,它正确地将2转换为00000010,但随后再次抛出1的异常


我不知道为什么会发生这种情况。

位集的字符串构造函数不将值从十进制(或十六进制)表示形式转换为二进制。如果它遇到的任何字符不是
0
1
,它将抛出
std::invalid_参数
异常。请尝试
std::stoi

value = bitset<8>(std::stoi(myString[j])).to_string();
value=bitset(std::stoi(myString[j])。to_string();

位集的字符串构造函数不会将值从十进制(或十六进制)表示形式转换为二进制。如果它遇到的任何字符不是
0
1
,它将抛出
std::invalid_参数
异常。请尝试
std::stoi

value = bitset<8>(std::stoi(myString[j])).to_string();
value=bitset(std::stoi(myString[j])。to_string();

value=bitset(stoi(myString,j)).to_string()“错误:没有重载函数的实例与参数列表匹配。参数类型为:(std::Vector,int)”@Noobgineer我没有看到
myString
实际上是一个向量。请选择更好的变量名。这就解决了它!Tyvm<代码>值=位集(stoi(myString,j)).to_string()“错误:没有重载函数的实例与参数列表匹配。参数类型为:(std::Vector,int)”@Noobgineer我没有看到
myString
实际上是一个向量。请选择更好的变量名。这就解决了它!Tyvm!!