[Last Call] Learn about multicloud storage options and how to improve your company's cloud strategy. Register Now

x
?
Solved

atoi question

Posted on 2013-05-24
10
Medium Priority
?
332 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
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 

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

Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

Introduction This article is a continuation of the C/C++ Visual Studio Express debugger series. Part 1 provided a quick start guide in using the debugger. Part 2 focused on additional topics in breakpoints. As your assignments become a little more …
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…
The goal of this video is to provide viewers with basic examples to understand recursion in the C programming language.
The goal of this video is to provide viewers with basic examples to understand how to create, access, and change arrays in the C programming language.

650 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