Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Converting string to integer using atoi in C++

  1. Nov 3, 2011 #1
    Hello, the problem that I was asked to complete was ; Write a program that inputs a string and reverses it. After the string has been reversed you must convert it to an integer and then take the square root of the integer. (using atoi)
    My code is as follows:
    Code (Text):
    int main ()
    {
        int i=0,L=50, S,x,;
        double z;
        char ori_string[50];
        char new_string[50];
        cout<<"Please enter a long string"<<endl;
        cin.getline(ori_string,50);
       
        for(i=0;i<L; i++)
        {
                     new_string[i]=ori_string[L-1-i];
        }
        for(L=50-strlen(ori_string);L<50;L++)
        {
                                           
                                             cout<<new_string[L];
         }
    cout<<endl;
    {
         x=atoi(new_string);
         z=sqrt(x);
         cout<<"The square root of the reversed string is: "<<z<<endl;
    }
        system("pause");
        return 0;
    }
    My problem is that my program isn't storing "new_string[L]" as anything so when I convert it to a integer nothing is there and the square root is zero. So my question to you all is how can i store "new_string[L]" so I can convert it to an integer using atoi?

    Any advice would be delightful!
    Thanks,
    Z
     
  2. jcsd
  3. Nov 3, 2011 #2
    I don't know too much about C++ but atoi is string to int and atol is strong to long int.

    Your code also seems to have a lot of stuff in it just to reverse a string and find its integer square root.

    For example, why would you need anything to do 50 iterations?
     
  4. Nov 3, 2011 #3

    Borek

    User Avatar

    Staff: Mentor

    First of all - you can't reverse the string assuming its length is 50 characters. What happens if it is not?

    new_string[L] is a character (element of the new_string array), not a string. You don't have to write new_string to cout character by character, cout << new_string should work.

    There is more, but I am not going to mention anything else now to not muddy the water.
     
  5. Nov 3, 2011 #4
    When I first wrote this program to reverse my number I simply had
    Code (Text):
    int main()
    {
        int i,L,;
        char ori_string[50];
        char new_string[50];
        cout<<"Please enter a long string"<<endl;
        cin.getline(ori_string,50);
     
         for(i=0;i<L; i++)
         {
                cout<<ori_string[L-1-i];
         }
             system("pause");
        return 0;
    }
     
    This returned the proper number but it was preceded by random characters for the first 46 spaces if the string was 3 digits long. This was the reasoning of structuring a second for loop. Yet now that I know that is the incorrect method, how do you suggest I fix this bit of code here so that it will only output the reverse of the string for after it does that I can easily convert it to an int and take the square root.

    (I know this differs from my initial question but I'm reasonably certain that this is where the problem is, yet if this assumption is wrong please let me know!)

    Thanks,
    Z
     
  6. Nov 3, 2011 #5

    Borek

    User Avatar

    Staff: Mentor

    Hint: L is not initialized.

    Hint2: with what should it be initialized?
     
  7. Nov 3, 2011 #6
    *UPDATE* I had a revelation sparked by a few of your comments:smile:

    Code (Text):
    int main()
    {
        int i,L=50,x;
        double z;
        char ori_string[L];
        char new_string[L];
        cout<<"Please enter a long string"<<endl;
        cin.getline(ori_string,50);
        L=strlen(ori_string);
     
         for(i=0;i<L; i++)
         {
               
                cout<<ori_string[L-1-i];
                new_string[i]=ori_string[L-1-i];
         }

         {
         x=atol(new_string);
         z=sqrt(x);
         cout<<"The square root of the reversed string is: "<<z<<endl;
    }
             system("pause");
        return 0;
    }
    Is my new properly working code, if there are any critiques or overhauls you may do feel free, I'd love to learn!

    Thanks,
    Z
     
  8. Nov 3, 2011 #7

    I like Serena

    User Avatar
    Homework Helper

    Hi Z! Welcome to PF! :smile:

    You're code will work properly.

    If you want to learn I'll give you an improvement.
    Your program won't function better, but it is better programming style.

    In C++ we don't really want to use char-arrays anymore (it's a remnant from its predecessor C).
    There are a number of pitfalls with them.
    In this case the most obvious ones are that you have a maximum size (50) and that you truncate your input.

    The C++ way to do things, is to use std::string.
    It works like this:
    Code (Text):

    #include <string>

    int main()
    {
        int i, L, x;
        double z;
        std::string ori_string;
        std::string new_string;
        cout << "Please enter a long string" << endl;
        getline(cin, ori_string);
       
        L = ori_string.length();
        new_string.resize(L);
        for (i = 0; i < L; i++)
        {
            cout << ori_string[L - 1 - i];
            new_string[i] = ori_string[L - 1 - i];
        }

        x = atol(new_string.c_str());
        z = sqrt(x);
        cout << "The square root of the reversed string is: " << z << endl;

        system("pause");
        return 0;
    }
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook




Similar Discussions: Converting string to integer using atoi in C++
Loading...