Suppose I want to read line a of integers from input like this:
1 2 3 4 5\\n
I want cin to stop at \'\\n\' character but cin doesn\'t seem
Use std::getline, this will do the trick
You can use the getline method to first get the line, then use istringstream to get formatted input from the line.
From this link, it is quite simple to achieve this.
#include <stdio.h>
int main(void) {
int i=0,size,arr[10000];
char temp;
do{
scanf("%d%c", &arr[i], &temp);
i++;
} while(temp!= '\n');
size=i;
for(i=0;i<size;i++){
printf("%d ",arr[i]);
}
return 0;
}
You can read all whitespace by setting noskipws on the istream
:
#include <ios>
#include <iostream>
#include <vector>
using std::vector;
vector<int> getc() {
char c;
vector<int> cl;
std::cin >> std::noskipws;
while (std::cin >> c && c != '\n') {
cl.push_back(c);
std::cin >> c;
}
return cl;
}
If the standard input contains only a single line, you might as well construct the vector with the istream_iterator
:
#include <iostream>
#include <iterator>
#include <vector>
using std::vector;
vector<int> getc() {
// Replace char with int if you want to parse numbers instead of character codes
vector<int> cl{
std::istream_iterator<char>(std::cin),
std::istream_iterator<char>()
};
return cl;
}
getchar()
is more efficient than cin
when working with characters at this situation
I tried to do the same with a line of characters with unknown length and want it to stop at a newline but it has an infinite loop and haven't detect the newline, so I just used getchar()
instead of cin
and it works
Use getline and istringstream:
#include <sstream>
/*....*/
vector<int> getclause() {
char c;
vector<int> cl;
std::string line;
std::getline(cin, line);
std::istringstream iss(line);
while ( iss >> c) {
cl.push_back(c);
}
return cl;
}