2015-10-16 2 views
1

В моей лаборатории я пытаюсь обработать строку, представляющую точку назначения на Земле. Примером этого является ....Назначение различных переменных для ввода из cin C++

"152/N 200/E California Ave"

В записках моего профессора, он сказал, что если вы сделали это ...

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

Какие потребляет весь путь до Калифорнии, где оттуда струна потребляется по одному за каждый пробел. Как это сделать, чтобы я использовал оставшуюся часть ввода? Вот как мои переменные выглядят при присваивании ...

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

адрес только держит «Калифорния», когда я хочу, чтобы держать «California Ave». Вот код, который у меня есть.

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; 
     */ 
    } 
+0

Проверьте [ввод C++ с пробелами] (http://stackoverflow.com/questions/5838711/c-cin-input -with-spaces) – sam

ответ

2

Обычный >> как оператор ввода разделяет входной сигнал в «слов», разделенных пробелами.

Чтобы избежать этого, рассмотрите возможность чтения одного элемента на строку ввода. Вы можете использовать std::getline от <string>, чтобы прочитать строку. Там, где вам нужно число, вы можете проанализировать строку, например. std::stoi.

Если у вас нет другого выбора, кроме как иметь дело со строкой, содержащей несколько элементов ввода, где в конце есть текстовые данные, которые могут содержать пробелы, то вы можете использовать std::istringstream для чтения элементов перед текстом.


Пример 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; 
} 
+0

мне нужно передать строку через цикл, чтобы получить каждое значение? –

+0

@Xari: Я приведу пример. –

+0

О, я добавлю еще немного. –

0

Проблема заключается в том, что вы пытаетесь ввести строки с пространством, поэтому, поскольку входы через cin ограничены пробелом '', вам нужно будет использовать std :: getline, который сделает конец входного делиметра символом новой строки. Пример реализации:

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

с этим вы можете ввести строку с пробелами. (конец строки будет после ввода нажатой пользователем, там для конца разделителя строк будет символом новой строки)

+0

К сожалению, я также хочу разбить строку на переменные типы удвоений и ints и в то же время потреблять остальную часть строки. Есть ли удобный способ сделать это? –

+0

снова должны быть какие-то символы или какие-то другие строки, на основе которых вы должны разбить строки, поэтому эти символы становятся разделителями для разбиения, находят делитель функцией find и функцией substr. строка s = "scott> = тигр"; string delimiter = "> ="; string token = s.substr (0, s.find (разделитель)); // вывод: scott –

+0

, скажем, в приведенном выше комментарии s = "123> = tiger", затем после разделения вы получите токен = "123", затем приведите его к целому или float с помощью int x = int (токен) –