web-dev-qa-db-fra.com

lire les entrées séparées par des espaces ou une nouvelle ligne ...?

Je saisis l'entrée d'un flux d'entrée standard. Tel que,

1 2 3 4 5

ou

1
2
3
4
5

J'utilise:

std::string in;
std::getline(std::cin, in);

Mais cela ne fait que prendre la nouvelle ligne, correct? Comment obtenir des entrées, qu'elles soient séparées par des espaces OR newline utilisant uniquement iosteam, string et cstdlib?

19
user618712

Il suffit d'utiliser:

your_type x;
while (std::cin >> x)
{
    // use x
}

operator>> ignorera les espaces blancs par défaut. Vous pouvez chaîner des choses pour lire plusieurs variables à la fois:

if (std::cin >> my_string >> my_number)
    // use them both

getline() lit tout sur une seule ligne, en indiquant si elle est vide ou contient des dizaines d'éléments séparés par des espaces. Si vous fournissez le délimiteur alternatif facultatif ala getline(std::cin, my_string, ' '), il ne fera toujours pas ce que vous semblez vouloir, par ex. les onglets seront lus dans my_string.

Probablement pas nécessaire pour cela, mais une exigence assez courante qui pourrait vous intéresser est de lire une seule ligne délimitée par des lignes, puis de la scinder en composants ...

std::string line;
while (std::getline(std::cin, line))
{
    std::istringstream iss(line);
    first_type first_on_line;
    second_type second_on_line;
    third_type third_on_line;
    if (iss >> first_on_line >> second_on_line >> third_on_line)
        ...
}
27
Tony Delroy

Utilisez 'q' comme argument optionnel de getline.

#include <iostream>
#include <sstream>

int main() {
    std::string numbers_str;
    getline( std::cin, numbers_str, 'q' );

    int number;
    for ( std::istringstream numbers_iss( numbers_str );
          numbers_iss >> number; ) {
        std::cout << number << ' ';
    }
}

http://ideone.com/I2vWl

4
Potatoswatter

l'utilisateur qui appuie sur Entrée ou sur les espaces est identique.

int count = 5;
int list[count]; // array of known length
cout << "enter the sequence of " << count << " numbers space separated: ";
// user inputs values space separated in one line.  Inputs more than the count are discarded.
for (int i=0; i<count; i++) {
    cin >> list[i];
}
1
mihai

std :: getline (flux, où aller?, délimiteurie

std::string in;
std::getline(std::cin, in, ' '); //will split on space

ou vous pouvez lire une ligne, puis la marquer en fonction du délimiteur de votre choix.

1
Tanner
#include <iostream>

using namespace std;

string getWord(istream& in) 
{
    int c;

    string Word;

    // TODO: remove whitespace from begining of stream ?

    while( !in.eof() ) 
    {

        c = in.get();

        if( c == ' ' || c == '\t' || c == '\n' ) break;

        Word += c;
    }

    return Word;
}

int main()
{
    string Word;

    do {

        Word = getWord(cin);

        cout << "[" << Word << "]";

    } while( Word != "#");

    return 0;
}
0
furas
int main()
{
    int m;
    while(cin>>m)
    {
    }
}

Cela lirait à partir de l'entrée standard si elle est séparée par un espace ou par une ligne.

0
AKhanna