Solved

atoi question

Posted on 2013-05-24
10
324 Views
Last Modified: 2013-07-07
Hi
I am using atoi function in the the code and want to handle tis particular error case.
any garbage input to atoi will result in 0 getting returned which is a success code.

Is there a function i can use that returns an error code for garbage in case, or throw an exception.
I can use STL probably not use boost, but still would like to know what the options are with
either.

thanks
0
Comment
Question by:Vlearns
10 Comments
 
LVL 86

Expert Comment

by:jkr
Comment Utility
A 'plain' C-style alternative would be 'strtol()', which will not only point you to conversion errors, but also to where they occurred, e.g.

int read_int() {

  string s;
  int n = 0;
  char* pCnvEnd;

  while(1) {
    cin >> s;
    n = strtol(s.c_str(),&pCnvEnd,10);
    if (*pCnvEnd != NULL) { // invalid chars in string, not an integer
      cout << "Not a valid number, please re-enter the value" << " ";
    } else {
      break; //valid, stop loop
    }
  }

  return n;
}

Open in new window


Or you could use a std::stringstream like

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

int read_int() {

  string s;
  int n = 0;

  while(1) {
    cin >> s;
    stringstream ss(s);

    ss >> n;

    if (ss.fail()) { // invalid chars in string, not an integer
      cout << "Not a valid number, please re-enter the value" << " ";
    } else {
      break; //valid, stop loop
    }
  }

  return n;
}

Open in new window

0
 

Author Comment

by:Vlearns
Comment Utility
Thanks for the responses.
here is the exact problem i am trying to solve

here is the string

response = (int)atoi(responsestring.c_str());

The responsestring is suppossed to be numerical codes like
1111
1222
3333
except in one case

where it is 4444\r\nurl=<redirect URL>.

this is what my code does

response = (int)atoi(responsestring.c_str());
idx = responsestring.find("url=");
                 if (response == User::ERR && idx != string::npos)
                 {
                     custom_error = "Please verify  " + responsestring.substr(idx + strlen("url="));
                 }
0
 
LVL 86

Accepted Solution

by:
jkr earned 500 total points
Comment Utility
In this case, 'strtol()' might help in two ways, e.g.

char* pCnvEnd;

response = (int)strtol(responsestring.c_str(),&pCnvEnd,10); // will return '4444'
idx = responsestring.find("url=");
                 if (response == User::ERR && pCnvEnd != NULL)
                 {
                     custom_error = "Please verify  " + responsestring.substr(pCnvEnd + strlen("\r\nurl="));
                 } 

Open in new window

0
 

Author Comment

by:Vlearns
Comment Utility
what happens if we get garbage?
0
 

Author Comment

by:Vlearns
Comment Utility
more specifically

what is the difference between 4444\r\nurl=<redirect URL>.

and 2222hellogarbage

garbage22222
0garbage8888
0
Find Ransomware Secrets With All-Source Analysis

Ransomware has become a major concern for organizations; its prevalence has grown due to past successes achieved by threat actors. While each ransomware variant is different, we’ve seen some common tactics and trends used among the authors of the malware.

 
LVL 86

Expert Comment

by:jkr
Comment Utility
You mean *only* garbage as input? That condition could be detected like

response = (int)strtol(responsestring.c_str(),&pCnvEnd,10);
if (responsestring.c_str() == pCnvEnd) {

  // nothing numeric at all
}

Open in new window

0
 
LVL 32

Expert Comment

by:phoffric
Comment Utility
.
0
 
LVL 86

Expert Comment

by:jkr
Comment Utility
2222hellogarbage - results in 2222 being returned and pCnvEnd pointing to hellogarbage  (offset 4 to string start)

garbage22222 - results in 0 being returned and pCnvEnd pointing to garbage  (offset 0 to string start)

0garbage8888 - results in 0 being returned and pCnvEnd pointing to garbage (offset 1 to string start)
0
 
LVL 32

Expert Comment

by:sarabande
Comment Utility
if the string always (and trustable) begins with a number, atoi is sufficient. it would stop converting digits at the fist non-digit (periods and minus excluded). the strtol is necessary if you want refuse bad user-input.

Sara
0
 
LVL 84

Expert Comment

by:ozo
Comment Utility
what do you want to do with
4444\r\nurl=<redirect URL>.
?
what do you want to do with
2222hellogarbage
or
garbage22222
or
0garbage8888
or whatever else you consider to be garbage?
0

Featured Post

How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

Join & Write a Comment

Many modern programming languages support the concept of a property -- a class member that combines characteristics of both a data member and a method.  These are sometimes called "smart fields" because you can add logic that is applied automaticall…
Windows programmers of the C/C++ variety, how many of you realise that since Window 9x Microsoft has been lying to you about what constitutes Unicode (http://en.wikipedia.org/wiki/Unicode)? They will have you believe that Unicode requires you to use…
The viewer will learn how to use the return statement in functions in C++. The video will also teach the user how to pass data to a function and have the function return data back for further processing.
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

772 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

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now