Sammieo
Sammieo

Reputation: 175

C++ read in a line of string as ints?

I am trying to read a line of string characters with numbers (e.g "30 40 50 20") and put them into a vector. I also need to avoid empty space and newlines. But when I read the input, it doesn't see the string "30", it sees the characters "3" and "4".

void Input() {
        getline(cin,line, '\n');
        for (int i = 0; i < line.length(); i++) {
            if (! (isspace(line[i]))) {
                cout << line[i] << ", ";
                    scores.push_back(line[i]);//(atoi(input));
            }
        }
        cout << scores.size() << "! ";
    }

A line like "30 40 50" won't give a vector size of 3, it will give a size of 6. What are the optimal ways to get around this issue?

EDIT: I should have clarified in the original message that this is for a challenge, in which I am unable to include the string stream library in the original case.

Upvotes: 0

Views: 109

Answers (4)

lukemtesta
lukemtesta

Reputation: 441

It is probably best to take advantage of an input stringsteam, example: http://www.cplusplus.com/reference/sstream/stringstream/stringstream/.

The extraction operator allows you to parse data from the stream to some variable of datatype T. Another advantage of input stringstreams is the ability to query whether the pass was successful, and in your case ignore whitespace characters by setting the skipws format flag.

Example:

int main () {

  std::istringstream ss("30 40 50");
  float val = 0.0f;

  while( ss >> std::skipws >> val )
  {
      std::cout << val << "\n";
  }

  return 0;
}

Out: 30 40 50

Upvotes: 0

molbdnilo
molbdnilo

Reputation: 66371

Putting the line into a std::istringstream and extracting the numbers from that is the best way.

Here's an alternative to a manual loop using the standard library:

std::istringstream numbers(line);
std::copy(std::istream_iterator<int>(numbers), 
          std::istream_iterator<int>(),
          std::back_inserter(scores));

Upvotes: 1

Lightness Races in Orbit
Lightness Races in Orbit

Reputation: 385144

I think you're doing the right thing grabbing the whole line before parsing, otherwise you get into a bit of a pickle. But you do actually have to do some parsing. Right now you're just pulling out individual characters.

The following isn't optimal but it'll get you started — continue using formatted stream extraction, but isolated to this line from the file.

So:

void Input()
{
    getline(cin, line, '\n');
    istringstream ss(line);

    int val;
    while (ss >> val)
      scores.push_back(val);

    cout << scores.size() << "! ";
}

Upvotes: 2

Some programmer dude
Some programmer dude

Reputation: 409176

Read the line and put into a std::istringstream, then read as "normally" using the >> operator from the string stream.

Upvotes: 1

Related Questions