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!!