从cin C ++为输入分配不同的变量

时间:2015-10-16 00:32:46

标签: c++ string cin

在我的实验室中,我正在尝试处理代表地球上目的地的线。这方面的一个例子是....

“152 / N 200 / E California Ave”

在我教授的笔记中,他说如果你这样做了......

std::cin >> latitude >> latitudeDirection >> longitude >> longitudeDirection >> address

它一直消耗到加利福尼亚州,从那里开始,每个空白处一次消耗一个字符串。我该怎么做才能消耗其余的输入?以下是我的变量在分配时的外观......

latitude = 152
latitudeDirection = "/N"
longitude = 200
longitudeDirection = "/E"
address = "California"

地址仅在我想要“加州大道”时才举行“加利福尼亚”。这是我到目前为止的代码。

int numberOfLocations;
    std::cin >> numberOfLocations;
    std::cin.ignore();
    for (int x = 0; x < numberOfLocations; x++) {
        double longitude, latitude;
        std::string longitudeDirection, latitudeDirection, address;

        /*
        std::cin >> latitude >> latitudeDirection >> longitude >> longitudeDirection >> address;
        std::cout << latitude << latitudeDirection << latitude << latitudeDirection << address << std::endl;
        */
    }

2 个答案:

答案 0 :(得分:2)

普通>>作为输入运算符将输入拆分为由空格分隔的“单词”。

为避免这种情况,请考虑每行输入一个项目。您可以使用std::getline中的<string>来读取一行。如果您需要一个号码,您可以使用例如std::stoi

如果您别无选择,只能处理包含多个输入项的字符串,最后可能包含空格的文本数据,那么您可以使用example来读取文本前的项目

示例1 - 每行读取一个项目:

#include <iostream>
#include <stdlib.h>         // exit, EXIT_FAILURE
#include <string>           // std::string
using namespace std;

void error( string const& s )
{
    cerr << "!" << s << endl;
    exit( EXIT_FAILURE );
}

auto get_input_line()
    -> string
{
    string line;
    getline( cin, line );
    if( cin.fail() ) { error( "Uh oh, ..." ); }
    return line;
}

auto main() -> int
{
    cout << "This program adds two numbers A and B." << endl;
    cout << "Number A, please? ";
    double const a = stod( get_input_line() );
    cout << "Number B, please? ";
    double const b = stod( get_input_line() );
    cout << a << " + " << b << " = " << a + b << "." << endl;
}

示例2 - 解析一行文本
(恕我直言并不聪明,但也许是一项要求)

#include <iostream>
#include <stdlib.h>         // exit, EXIT_FAILURE
#include <string>           // std::string
#include <sstream>          // std::istrstream
using namespace std;

void error( string const& s )
{
    cerr << "!" << s << endl;
    exit( EXIT_FAILURE );
}

auto main() -> int
{
    string const data   = "152/N 200/E California Ave";

    cout << "This program parses the line '" << data << "'." << endl;
    cout << endl;
    cout << "Result:" << endl;

    istringstream stream( data );
    char    dummy_char;
    int     latitude;
    char    latitudeDirection;
    int     longitude;
    char    longitudeDirection;
    string  address;

    stream
        >> latitude >> dummy_char >> latitudeDirection
        >> longitude >> dummy_char >> longitudeDirection;
    if( stream.fail() ) { error( "Initial items extraction failed." ); }
    while( stream.peek() == ' ' ) { stream.get(); }
    getline( stream, address );

    cout << "> "
        << latitude << "/" << latitudeDirection << " "
        << longitude << "/" << longitudeDirection << " "
        << "'" << address << "'"
        << "<" << endl;
}

答案 1 :(得分:0)

这里的问题是,你试图输入带空格的字符串,因此,由于cin的输入由空格''分隔,你将不得不使用std :: getline,这将使输入范围的结束为新队。 示例实施:

#include <iostream>
using namespace std;
int main()
{
    string s;
    getline(cin,s);
    cout<<s;
    return 0;
}

用这个你可以输入带空格的字符串。 (字符串的结尾将在用户按下的n输入之后,字符串分隔符的结尾为换行符)