?
Solved

atoi question

Posted on 2013-05-24
10
Medium Priority
?
331 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
10 Comments
 
LVL 86

Expert Comment

by:jkr
ID: 39195201
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
ID: 39195240
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 2000 total points
ID: 39195258
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
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 

Author Comment

by:Vlearns
ID: 39195285
what happens if we get garbage?
0
 

Author Comment

by:Vlearns
ID: 39195298
more specifically

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

and 2222hellogarbage

garbage22222
0garbage8888
0
 
LVL 86

Expert Comment

by:jkr
ID: 39195299
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
ID: 39195300
.
0
 
LVL 86

Expert Comment

by:jkr
ID: 39195319
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 35

Expert Comment

by:sarabande
ID: 39198554
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
ID: 39198562
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

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

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

C++ Properties One feature missing from standard C++ that you will find in many other Object Oriented Programming languages is something called a Property (http://www.experts-exchange.com/Programming/Languages/CPP/A_3912-Object-Properties-in-C.ht…
This is a short and sweet, but (hopefully) to the point article. There seems to be some fundamental misunderstanding about the function prototype for the "main" function in C and C++, more specifically what type this function should return. I see so…
The goal of this video is to provide viewers with basic examples to understand opening and reading files in the C programming language.
The goal of the video will be to teach the user the difference and consequence of passing data by value vs passing data by reference in C++. An example of passing data by value as well as an example of passing data by reference will be be given. Bot…
Suggested Courses

762 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