Что еще я могу добавить, чтобы правильно разделить строку в C ++ по пробелам или пробелам? - PullRequest
0 голосов
/ 15 октября 2018

Итак, я знаю, что разбить строку в C ++ не так просто, как в Python.Я пытаюсь разбить строки в этом формате "57.4317 / N 4.7892 / E London Airport" и "30.8534 / N 125.2235 / W Madrid Airport" по их пробелам или "/«потому что я пытаюсь вывести цифры (57.4317 и 4.7892).Так что я бы получил:

57.4317
/N
7.7892
/E 
London 
Airport

Вот что у меня так далеко.Я считаю, что это работает, когда я использую ",", но для "/" или пробела это не работает. Я получаю бесконечный цикл?

#include <iostream>
using namespace std;
#include <string>

int main()
{
    string test1 = "57.4317/N 4.7892/E London Airport";
    string test2[10];
    int found, i=0;
    while (test1.size() != 0){
        found = test1.find('/');
        for (int f = 0; f < found; f++){
            test2[i] += test1[f];

        }
        test1.erase(0, found + 1);
        i++;

    }
    for (int d = 0; d < i; d++){
        cout << test2[d] << endl;
    }


    return 0;
}

Как бы я это исправить? спасибо!

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Попробуйте использовать регулярное выражение.Это очень удобно и предназначено для такого рода вещей.Ниже приведен ответ на вашу проблему с помощью регулярного выражения.

  #include <iostream> 
   #include <regex> 
   #include<string.h> 
   using namespace std; 

  int main() 
  { 
    std::string subject("57.4317/N 4.7892/E London Airport");
    try {
    std::regex re("[/ ]");
    std::copy(std::sregex_token_iterator(subject.begin(), subject.end(), re, -1),
            std::sregex_token_iterator(),
            std::ostream_iterator<std::string>(std::cout, "\n"));
    } catch (std::regex_error& e) {
    // Syntax error in the regular expression
    }
    return 0; 
}
0 голосов
/ 15 октября 2018

Один из подходов к синтаксическому анализу lat / lon из строки - использование stringstream для последующего форматированного чтения строки в нужные вам компоненты.Хотя это немного жестко с точки зрения входного формата, если у вас фиксированный формат, он работает хорошо.

В следующем примере просто используется ваша строка test1 со строковым потоком для чтения обоих latи lon как double значения, пропуская промежуточный /N, выделяя их как символы и позволяя >> использовать начальные пробелы до lon.(вы можете легко приспособиться к сохранению N (или S) и E (или W), предоставив две дополнительные символьные переменные и сохранив при необходимости).

Коротким примером будет:

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

int main (void) {

    double lat, lon;
    string test1 = "57.4317/N 4.7892/E London Airport";
    stringstream s (test1);
    char c;

    if ((s >> lat) && (s >> c) && (s >> c) && (s >> lon))
        cout << "lat: " << lat << "\nlon: " << lon << '\n';
}

Пример использования / вывода

$ ./bin/ssparselatlon
lat: 57.4317
lon: 4.7892

Другой подход заключается в простом использовании указателя символа и литерала c_str() из вашей строки для ходьбыуказатель на строку, вызывающий strtod, когда встречается цифра, и использование параметра endptr, чтобы пройти дальше значения и продолжить поиск следующей цифры.Вы можете сделать что-то похожее с циклом с автозапуском или итератором и stod.Все зависит от того, насколько гибкой должна быть ваша процедура ввода.Если ваш формат ввода фиксирован, то сохранить его так же просто, как и любой другой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...