Solved

How to check if C++ string has junk values

Posted on 2010-09-22
14
490 Views
Last Modified: 2012-05-10
Hi,

I need to check if the string has wrong/junk values. How can I do it?

My string should have only integer values in them.

Example:
std::string s1="1234"      //This is a valid value
std::string s2="123a"      //This or any combination (including control characters) is not valid

I am using C++ (GNU compiler) and Linux.

thanks,
Sreeni
0
Comment
Question by:shykumar
  • 5
  • 3
  • 3
  • +2
14 Comments
 
LVL 86

Accepted Solution

by:
jkr earned 168 total points
Comment Utility
Try converting it to 'int' and see if that works, e.g.
#include <sstream>



std::string s2="123a";



int test;

std::stringstream ss(s2);



ss >> test;



if (ss.fail()) {



  // not only integer numbers

}

Open in new window

0
 
LVL 32

Assisted Solution

by:phoffric
phoffric earned 166 total points
Comment Utility
const char * cstr = str.c_str(); // convert string to c-style string pointer    http://www.cplusplus.com/reference/string/string/c_str/   for(size_t i=0; i      if( !isdigit(cstr[i]) ) {http://www.cplusplus.com/reference/clibrary/cctype/isdigit/
0
 
LVL 32

Expert Comment

by:phoffric
Comment Utility
re:
======================
std::string s2="123a";
int test;
std::stringstream ss(s2);
ss >> test;
======================
    This gives 123 since only valid chars making up an integer will be read in.
0
 
LVL 32

Expert Comment

by:phoffric
Comment Utility
But the next attempt to do a ss >> test should fail due to the 'a'.
0
 
LVL 40

Assisted Solution

by:evilrix
evilrix earned 166 total points
Comment Utility
If you just want to filter out any arbitrary values or value just use the find_first_of or find_first_not_of method on the string.

http://www.cplusplus.com/reference/string/string/find_first_not_of/
http://www.cplusplus.com/reference/string/string/find_first_of/
0
 
LVL 31

Expert Comment

by:farzanj
Comment Utility
Please try this:
try
{
     i1 = atoi (s1);   //try converting string to integer
}


It is up to you if you want to use just "catch" with it to display the error message or want to "throw" and then catch.  It is up to your design.

Another observation,

Just use namespace std, it makes life much easier and syntax beautiful.

So you can have
#include <iostream>
#include <string>

using namespace std;


int main()
{


}

.....

Hope it helps
0
What Is Threat Intelligence?

Threat intelligence is often discussed, but rarely understood. Starting with a precise definition, along with clear business goals, is essential.

 
LVL 40

Expert Comment

by:evilrix
Comment Utility
>> It is up to you if you want to use just "catch" with it to display the error message or want to "throw" and then catch.  

atoi doesn't throw - it is a C function. Further, how will you distinguish 0 from non-numeric values that will also be reported as 0?
0
 
LVL 31

Expert Comment

by:farzanj
Comment Utility
Ok.  Please disregard the try part.

I think the best way is to use "at" member function and testing each character to individually if it is between 0 and 9.  Make a small function IsNum, if you want to test it.  If you don't care to test, atoi should ignore trailing garbage.  So 1234abc should change to 1234.

if s is the string, atoi(s.c_str())
0
 
LVL 40

Expert Comment

by:evilrix
Comment Utility
>> I think the best way is to use "at" member function and testing each character to individually if it is between 0 and 9.

What "at" member function?

Seriously, why reinvent the wheel? string already has two perfectly good functions to do this as I explained above! http:#33737718
0
 
LVL 31

Expert Comment

by:farzanj
Comment Utility
I don't think I am reinventing the wheel.  May be I missed but I don't think there is a member function to test whether string is an integer.  The function atoi() removes any trailing garbage.

With "at" you can.  I know you can do it without "at".  It is just made for this purpose.

//Is number
bool success = true;
for(int i = 0; i < s.length(); i++)
{
    if( s.at(i) < 0 || s.at(i) > 9 )
    {
        success = false;
        break;
    }
}

//If success == false, it was not an integer.
0
 
LVL 40

Expert Comment

by:evilrix
Comment Utility
>> The function atoi() removes any trailing garbage.

The asker isn't asking to convert (which might be one reason to want to remove "trailing garbage") they are asking "How to check if C++ string has junk values" and you just cannot do this (properly) with atoi because it will always return you a number.

http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/

Return Value

On success, the function returns the converted integral number as an int value.
If no valid conversion could be performed, a zero value is returned.
If the correct value is out of the range of representable values, INT_MAX or INT_MIN is returned.

So how does that tell you if it contains "junk"?

>> May be I missed but I don't think there is a member function to test whether string is an integer
http://www.cplusplus.com/reference/string/string/find_first_not_of/
Look at the example they provide. A modified version is below, which will solve the askers problem.


string s ("");
if ( s.find_first_not_of("0123456789") != string::npos )
{
    // contains a non-numeric value
}

Don't you agree that is a lot simpler than what you posted previously?

>> With "at" you can.
Sorry, just realised you were referring to the member function on string. Yes, you can use that to access the individual characters in the string - but you don't need to do this for solving this problem as string already has a member to do this.
0
 
LVL 1

Expert Comment

by:dkhoo
Comment Utility
bool isNum(const char* p)
{
      istringstream s(p);
      double d;
      s >> d;
      return s && s.rdbuf()->in_avail() == 0;
}
0
 
LVL 40

Expert Comment

by:evilrix
Comment Utility
This question has been classified as abandoned and is being closed as part of the Cleanup Program.  See my comment at the end of the question for more details.
0

Featured Post

How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

Join & Write a Comment

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…
Templates For Beginners Or How To Encourage The Compiler To Work For You Introduction This tutorial is targeted at the reader who is, perhaps, familiar with the basics of C++ but would prefer a little slower introduction to the more ad…
The goal of the video will be to teach the user the concept of local variables and scope. An example of a locally defined variable will be given as well as an explanation of what scope is in C++. The local variable and concept of scope will be relat…
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.

728 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

10 Experts available now in Live!

Get 1:1 Help Now