Create a list of numbers

E

Eric Lilja

Hello, I'm working on my C++ homework and I have a question about the
following function.
It's part of my code the handles command line arguments. Here's the code:

static void
extract_numbers(const char* optarg, vector<string>& numbers)
{
const char* str = optarg;

while(true)
{
string s(str);
string::size_type index = s.find_first_of(',');

if(index == string::npos)
{
string temp(s.c_str(), s.length());

numbers.push_back(temp);

break;
}
else
{
string temp(s.c_str(), index);

numbers.push_back(temp);

str += (index + 1);
}
}
}

optarg points to a null-terminated string of the following form:
somenumber1,somenumber2,somenumber3
where somenumber* is a, *drumroll*, number. It needs to extract these
numbers and put them in the vector. Note that
optarg may point to anything, I haven't made any sanity checks on the input
at this point and it may also
contain only one number. My way seems to work for "friendly" input, is it ok
to hand in as it is (I need to perform better on
this assignment) or can it be improved/bug fixed?

Thanks for any help!

/ Eric
 
V

Victor Bazarov

Eric said:
Hello, I'm working on my C++ homework and I have a question about the
following function.
It's part of my code the handles command line arguments. Here's the code:

static void
extract_numbers(const char* optarg, vector<string>& numbers)
{
const char* str = optarg;

while(true)
{
string s(str);
string::size_type index = s.find_first_of(',');

if(index == string::npos)
{
string temp(s.c_str(), s.length());

numbers.push_back(temp);

break;
}
else
{
string temp(s.c_str(), index);

numbers.push_back(temp);

str += (index + 1);
}
}
}

optarg points to a null-terminated string of the following form:
somenumber1,somenumber2,somenumber3
where somenumber* is a, *drumroll*, number. It needs to extract these
numbers and put them in the vector. Note that
optarg may point to anything, I haven't made any sanity checks on the input
at this point and it may also
contain only one number. My way seems to work for "friendly" input, is it ok
to hand in as it is (I need to perform better on
this assignment) or can it be improved/bug fixed?

Try it with different inputs, like

,something,somethingelse
or
,,something
or
something,,
or
something,,,lastthing

If you get it all there, you're fine.

Since it's only part of the program, you are still in need to fix the
conversion later and detect any errors during that. It would be nice
if your program while detecting the error in the input knew where the
erroneous input is in the original string. If you have spare time, you
could work on that.

V
 
M

Michael Kurz

Eric Lilja said:
Hello, I'm working on my C++ homework and I have a question about the
following function.
It's part of my code the handles command line arguments. Here's the code:

static void
extract_numbers(const char* optarg, vector<string>& numbers)
{
const char* str = optarg;

while(true)
{
string s(str);
string::size_type index = s.find_first_of(',');

if(index == string::npos)
{
string temp(s.c_str(), s.length());

numbers.push_back(temp);

break;
}
else
{
string temp(s.c_str(), index);

numbers.push_back(temp);

str += (index + 1);
}
}
}


Remark:
I would create a class, which is able to parse a string and seperate it into
parts.
As IMHO this task is needed very very often. Something like the split()
function in perl. We inhouse have a class named LineParser, which does this.
Whenever you want to split up strings with some seperation character using
such a spliiter class is much easier and with less probability for errors,
if the class is working properly once.


Regards
Michael
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,756
Messages
2,569,540
Members
45,025
Latest member
KetoRushACVFitness

Latest Threads

Top