Program is suppose to convert binary to hex.. it says that i need a class/struct/union to the left of ".substr" but im pretty sure convert should be working..

#include <iostream>
#include <string>
using namespace std; 

int main ()



{
	string convert [8]; 
	string bin[16]= {"0000", "0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};
	string hex[16]= { "0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"}; 
	string binfinal; 
	
	convert[0]= convert.substr (0,4);
	convert[1]= convert.substr (4,4);
	convert[2]= convert.substr (8,4);
	convert[3]=	convert.substr (12,4);
	convert[4]=	convert.substr (16,4);
	convert[5]= convert.substr (20,4);
	convert[6]= convert.substr (24,4);
	convert[7]= convert.substr (28,4);

		for(int i=0; i< 8; i+=4)

		if (convert[i] == bin[0])
		{
			cout << hex[0];
		}

		else if (convert[i] == bin[1])
		{
			cout << hex[1];
		}
				

		else if (convert[i] == bin[2])
		{
			cout << hex[2];
		}
				

		else if (convert[i] == bin[3])
		{
			cout << hex[3];
		}
				

		else if (convert[i] == bin[4])
		{
			cout << hex[4];
		}
				

		else if (convert[i] == bin[5])
		{
			cout << hex[5];
		}
				

		else if (convert[i] == bin[6])
		{
			cout << hex[6];
		}
				

		else if (convert[i] == bin[7]) 
		{
			cout << hex[7];
		}
				

		else if (convert[i] == bin[8])
		{
			cout << hex[8];
		}
				

		else if (convert[i] == bin[9])
		{
			cout << hex[9];
		}
				

		else if (convert[i] == bin[10])
		{
			cout << hex[10];
		}
				

		else if (convert [i]== bin[11])
		{
			cout << hex[11];
		}
				

		else if (convert[i] == bin[12])
		{
			cout << hex[12];
		}
				
			

		else if (convert[i] == bin[13])	
		{
			cout << hex[13];	
		}
			

		else if (convert[i] == bin[14])
		{
			cout << hex[14];
		}
			

		else if (convert[i]== bin[15])
		{
			cout << hex[15];
		}
			
	}

{
	cout<<"Enter a 32 binary value: ";
	cin>>binfinal;

	
	if(binfinal.length()!=16 && binfinal.length()!=32)
	{
		cout <<"Error! Binary string is invalid length.";
	
	}
	else 
	{   
		for(int i=0; i<binfinal.length(); i++)
		{
			if(binfinal[i]!='0' && binfinal[i]!='1')
			{
				cout<<" Retry only input 0 and 1 values" << binfinal[i]<< endl;
				
		
			}
		}
	}


return 0;
}

Recommended Answers

All 5 Replies

#1) Why are you using a string to hold 1 hex character. Use a char.
#2) Make a loop instead of 16 nested IF statements.
#3) Why are you taking the substring of convert and loading it into convert? Isn't that like digging a hole and putting the dirt in the hole?

I was using char at first but then it kept telling my I had to many initializers but it works with the string... and I switched the load to conversion only now the output aborts itself for some reason

#include <iostream>
#include <string>
using namespace std; 

int main ()
{
	string convert[8];
	string conversion;
	string bin[16]= {"0000", "0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};
	string hex[16]= { "0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"}; 
	string binfinal; 
	
	convert[0]= conversion.substr (0,4);
	convert[1]= conversion.substr (4,4);
	convert[2]= conversion.substr (8,4);
	convert[3]=	conversion.substr (12,4);
	convert[4]=	conversion.substr (16,4);
	convert[5]= conversion.substr (20,4);
	convert[6]= conversion.substr (24,4);
	convert[7]= conversion.substr (28,4);

		for(int i=0; i< 8; i+=4)

		if (convert[i] == bin[0])
		{
			cout << hex[0];
		}

		else if (convert[i] == bin[1])
		{
			cout << hex[1];
		}
				

		else if (convert[i] == bin[2])
		{
			cout << hex[2];
		}
				

		else if (convert[i] == bin[3])
		{
			cout << hex[3];
		}
				

		else if (convert[i] == bin[4])
		{
			cout << hex[4];
		}
				

		else if (convert[i] == bin[5])
		{
			cout << hex[5];
		}
				

		else if (convert[i] == bin[6])
		{
			cout << hex[6];
		}
				

		else if (convert[i] == bin[7]) 
		{
			cout << hex[7];
		}
				

		else if (convert[i] == bin[8])
		{
			cout << hex[8];
		}
				

		else if (convert[i] == bin[9])
		{
			cout << hex[9];
		}
				

		else if (convert[i] == bin[10])
		{
			cout << hex[10];
		}
				

		else if (convert [i]== bin[11])
		{
			cout << hex[11];
		}
				

		else if (convert[i] == bin[12])
		{
			cout << hex[12];
		}
				
			

		else if (convert[i] == bin[13])	
		{
			cout << hex[13];	
		}
			

		else if (convert[i] == bin[14])
		{
			cout << hex[14];
		}
			

		else if (convert[i]== bin[15])
		{
			cout << hex[15];
		}
			

	cout<<"Enter a 32 binary value: ";
	cin>>binfinal;

	
	if(binfinal.length()!=16 && binfinal.length()!=32)
	{
		cout <<"Error! Binary string is invalid length.";
	
	}
	else 
	{   
		for(int i=0; i<binfinal.length(); i++)
		{
			if(binfinal[i]!='0' && binfinal[i]!='1')
			{
				cout<<" Retry only input 0 and 1 values" << binfinal[i]<< endl;
				
		
			}
		}
	}
return 0;
}

Point out the changes you've made so we don't have to scan the code.

>> the output aborts itself for some reason

The process can either run to completion and exit with return code 0 (whether you intended it to or not) or you can get a premature termination due to a run-time error, in which case you should get some type of error message and maybe a line number. What's the input, if any, what's the output, if any, what's the error message, if any, what's the line number, if any?

I added line 8 and changed lines 13-20 to have conversion loaded to convert

I think you should use:
convert[0]= binfinal.substr (0,4);

Because you want to cut the binfinal string, not the convert.
Before it, you have to ask for the input.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.