Solved

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

Posted on 2004-10-18
6
464 Views
Last Modified: 2008-01-09
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
Comment
Question by:cnesb860
  • 3
  • 2
6 Comments
 
LVL 4

Accepted Solution

by:
pankajtiwary earned 150 total points
ID: 12342999
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
 
LVL 1

Author Comment

by:cnesb860
ID: 12343234
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
 
LVL 15

Assisted Solution

by:efn
efn earned 150 total points
ID: 12344104
    //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
VMware Disaster Recovery and Data Protection

In this expert guide, you’ll learn about the components of a Modern Data Center. You will use cases for the value-added capabilities of Veeam®, including combining backup and replication for VMware disaster recovery and using replication for data center migration.

 
LVL 1

Author Comment

by:cnesb860
ID: 12344569
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
 
LVL 1

Author Comment

by:cnesb860
ID: 12364823
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
 
LVL 15

Expert Comment

by:efn
ID: 12365820
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

Master Your Team's Linux and Cloud Stack!

The average business loses $13.5M per year to ineffective training (per 1,000 employees). Keep ahead of the competition and combine in-person quality with online cost and flexibility by training with Linux Academy.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Fully specialized class template function 21 136
Find Visual Studio Tools 2 103
Error C2678: binary '!=': no operator found... 4 48
How do i run a c++ file? 15 28
When writing generic code, using template meta-programming techniques, it is sometimes useful to know if a type is convertible to another type. A good example of when this might be is if you are writing diagnostic instrumentation for code to generat…
Article by: SunnyDark
This article's goal is to present you with an easy to use XML wrapper for C++ and also present some interesting techniques that you might use with MS C++. The reason I built this class is to ease the pain of using XML files with C++, since there is…
The viewer will be introduced to the technique of using vectors in C++. The video will cover how to define a vector, store values in the vector and retrieve data from the values stored in the vector.
The viewer will be introduced to the member functions push_back and pop_back of the vector class. The video will teach the difference between the two as well as how to use each one along with its functionality.

773 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question