[Webinar] Streamline your web hosting managementRegister Today

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 517
  • Last Modified:

convert between float and char* (prefer to use sscanf )

I have built my own version of a fraction class, with the following variables:
int myNum
int myDen
char* outputString


My ToString() method outputs the a fraction like this:

// return a string for the programmer to use in his program. (using <sprintf>)
char *Fraction::ToString()
{
       //allocate memory for <outputString>
       char buf[500];
       outputString= (char*) new char[(int)strlen(itoa(myNum, buf, 10)) + 1 + (int)strlen(itoa(myDen, buf, 10)) +1];

       //print <outputString>
       sprintf(outputString, "%d/%d", myNum, myDen);
       return outputString;
}



My ToFloat() function will have to store the fraction as a float, and make it available for output. Should I use sscanf()? here's what I have so far for my ToFloat() function:

//Convert a Fraction to a float for outputting pruposes, or use elsewhere in the main program code.
float Fraction::ToFloat()
{
       if (myDen != 0){
               ToLowestTerms();
      
               //convert the fraction to a float, then make this value a char*
      char temp[100] = (char*)((float)(myNum / myDen));//the float operator has already been overridden

      sscanf(temp, "%f", this->theString);//store this (char*)float in memory
      return this->theString;

       }else{
      return 0.0;
       }
}


I need this ASAP, and your help is much appreciated.
an aspiring programmer
0
cnesb860
Asked:
cnesb860
  • 3
  • 2
2 Solutions
 
pankajtiwaryCommented:
Hi cnesb860,

There are a few things that I would like to comment on.

When you are wroking with C++, it gives you a hell lot of easy to use tools as compared with C so for I/O I advise you to use cin and cout similarly, in place of sprintf and sscanf, you can use stringstream classes. Those are much easier to use and many problems will be handled by the language itself. So, I would like to change your ToString() function to

string tostring() {
    ostringstream o ;
    o << num << "/" << den << endl ;
    return o.str();
}

Similarly, the ToFloat() function will be something like

string tofloat() {
    ostringstream o ;
    o << static_cast<float>(num)/den << endl ;
    return o.str();
}

You can do whatever you want to do with the resulted strings.

Cheers!
0
 
cnesb860Author Commented:
That helped a little. Thanks. But it would be nice if I could allocate the char* and place the values into memory. Also, which way would be more efficient for future reference? It would be nice to be able to follow this psuedo-code:

//notice the return type
float Fraction::ToFloat() {

     //allocate char* <outputString> using keyword new if this hasn't already been done

     //convert the fraction from the form <intNum/intDen> to the form <float>

     //store the <float> in the char* <outputString> for later access

     //return the float value

}

Thanks again for your help pankajtiwary. I may do it that way for my next solution, I need to return a float for this specific problem. I am just curios how to store that <float> in memory for use elsewhere.
0
 
efnCommented:
    //allocate char* <outputString> using keyword new if this hasn't already been done

It would be simpler just to have a string member or a large enough character array member.

     //convert the fraction from the form <intNum/intDen> to the form <float>

pankajtiwary has shown you how to do this.  His (or her) method will work better than your original code, because it converts one of the terms to float before doing the division, so you get floating point division.  The original code did the division first, then converted the result to float.  Because the terms are integers, you would get integer division, which truncates the fractional part--not appealing in a fraction class.

     //store the <float> in the char* <outputString> for later access

If you want to use a character array instead of a string object, you can use the sprintf function to format a floating-point number into it.
0
The new generation of project management tools

With monday.com’s project management tool, you can see what everyone on your team is working in a single glance. Its intuitive dashboards are customizable, so you can create systems that work for you.

 
cnesb860Author Commented:
Thanks to you both. You did a good job of explaining exactly what your code was doing, which is helpful to as "aspiring programmer" like me. and thanks for being so quick on the draw, as this is for a school assignment. :)
0
 
cnesb860Author Commented:
I have a question about the method that you recommended I use. Is stringstream'ing compatible with command line AND gui programs?

I ask b/c I am working on several different classes which are basicly my own data types. Whatever way I build my classes, I want something with the most reusability so I only have to write this stuff once.

Thanks a bunch to all.
0
 
efnCommented:
The most universal form is probably a character array, but you can convert a standard string to a character array with the c_str function.  So in return for the convenience of using a string object, when you want to pass it to a function that expects a character array, you have to call this function.

If all you are going to do with the string is pass it to functions that want character arrays, you might as well keep it in a character array.  If you want to do more ambitious things with it, you might consider using a string object.
0

Featured Post

Never miss a deadline with monday.com

The revolutionary project management tool is here!   Plan visually with a single glance and make sure your projects get done.

  • 3
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now