Как проанализировать сложную строку с C++?

Я пытаюсь выяснить, как я мог проанализировать это строковое использование"sstream"и C++

Формат его: "строка, интервал, интервал".

Я должен быть в состоянии отвести первую роль строки, которая содержит IP-адрес к станд.:: строка.

Вот пример этой строки:

std::string("127.0.0.1,12,324");

Я должен был бы тогда получить

string someString = "127.0.0.1";
int aNumber = 12;
int bNumber = 324;

Я упомяну снова, что не могу использовать boost библиотека, просто sstream :-)

Спасибо

12
задан Goles 15 January 2010 в 16:22
поделиться

4 ответа

Аналогичная проблема уже обсуждалась: Как распознать прямоугольники на этом изображении?

Что касается ваших данных, то прямоугольники, которые вы пытаетесь найти, являются единственными черными объектами. Так что вы можете попытаться сделать пороговую бинаризацию: черные пикселы те, которые имеют ВСЕ три значения RGB меньше 40 (я нашел это эмпирически). Эта простая операция делает ваш картинный выглядит следующим образом:

binarized picture

После этого вы можете применить преобразование Хафа для поиска строк (обсуждается в теме, на которую я ссылался), или вы можете сделать это проще. Вычислите интегральные проекции черных пикселей на оси X и Y. (Проекция на X является вектором x_i - числа черных пикселей, так что она имеет первую координату, равную x_i). Итак, вы получаете возможные значения x и y как пики проекций. Затем просмотрите все возможные сегменты, ограниченные найденными x и y (если существует много черных пикселей между (x_i, y_j) и (x_i, y_k), вероятно, есть линия). Наконец, составьте сегменты линий в прямоугольники!

-121--2636597-

Как и в случае с другими платформами для разработки мобильных приложений, эти поля обычно слишком новые для программ уровня. Вы найдете другие образовательные возможности там, есть классы, книги, скринкасты в iPhone, PalmOS, Android, Blackberry и т.д. разработки просто Google подальше.

Есть вещи, как аспирантура Tisch Interactive Telecommunications Program в Нью-Йорке. Произведенная там работа часто имеет мобильный спин к ней .

Вот учебный план для Mobile Me (dia) , например, хотя я не уверен, является ли этот класс конкретно ITP.

В Калифорнии вы можете обратиться в Центр исследований в области вычислительной техники и искусства , который, я думаю, преследует несколько схожие цели.

Чтобы найти другие школы, обучающиеся на курсах по разработке Android, вы можете попробовать поиск, например: «android development» site: .edu . Довольно много людей с классами по крайней мере: Калифорнийский университет, Карнеги-Меллон, Колумбия, Темпл-университет и многие другие.

Обновление

Немного гуглинга находит магистерскую программу по мобильным технологиям и бизнесу в университете Ювяскюля в Финляндии, которая, кажется, довольно тесно связана с, если не совсем ответ на ваш вопрос.

-121--1882304-

Вот полезная функция токенизации. Он не использует потоки, но может легко выполнить требуемую задачу, разбив последовательность на запятые. Тогда вы можете делать все, что хотите с результирующим вектором токенов.

/// String tokenizer.
///
/// A simple tokenizer - extracts a vector of tokens from a 
/// string, delimited by any character in delims.
///
vector<string> tokenize(const string& str, const string& delims)
{
    string::size_type start_index, end_index;
    vector<string> ret;

    // Skip leading delimiters, to get to the first token
    start_index = str.find_first_not_of(delims);

    // While found a beginning of a new token
    //
    while (start_index != string::npos)
    {
        // Find the end of this token
        end_index = str.find_first_of(delims, start_index);

        // If this is the end of the string
        if (end_index == string::npos)
            end_index = str.length();

        ret.push_back(str.substr(start_index, end_index - start_index));

        // Find beginning of the next token
        start_index = str.find_first_not_of(delims, end_index);
    }

    return ret;
}
3
ответ дан 2 December 2019 в 06:26
поделиться

Библиотека инструментов Toolkit C ++ (STRTK) имеет следующее решение для вашей проблемы:

int main()
{
   std::string data("127.0.0.1,12,324");
   string someString;
   int aNumber;
   int bNumber;
   strtk::parse(data,",",someString,aNumber,bNumber);
   return 0;
}

больше примеров можно найти здесь

13
ответ дан 2 December 2019 в 06:26
поделиться

Не нравится, но вы можете использовать STD :: GetLine, чтобы разделить строку:

std::string example("127.0.0.1,12,324");
std::string temp;
std::vector<std::string> tokens;
std::istringstream buffer(example);

while (std::getline(buffer, temp, ','))
{
    tokens.push_back(temp);
}

, затем вы можете извлечь необходимую информацию из каждой из разделяемых строк.

6
ответ дан 2 December 2019 в 06:26
поделиться

Два альтернативных решения:

  • Хранить полезные материалы в отдельной коллекции.
  • Добавьте метод DrawIfPossible () в IItem . IDrawableItem должен переопределять его для вызова Draw () , другие реализаторы IItem () должны иметь пустую реализацию.

Явный запрос типа считается признаком того, что с конструкцией может быть что-то не так.

-121--4716603-

Мы успешно использовали этот код:

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace Utility {
    internal static class ObjectCloner {
        public static T Clone<T>(T obj) {
            using (MemoryStream buffer = new MemoryStream()) {
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(buffer, obj);
                buffer.Position = 0;
                T temp = (T)formatter.Deserialize(buffer);
                return temp;
            }
        }
    }
}

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

Крис

-121--3448161-

Вы могли бы сделать что-то подобное, а также я верю (Полностью с верхней части моей головы, так что извиняюсь, если я сделал некоторые ошибки там)...

stringstream myStringStream( "127.0.0.1,12,324" );
int ipa, ipb, ipc, ipd;
char ch;
int aNumber;
int bNumber;
myStringStream >> ipa >> ch >> ipb >> ch >> ipc >> ch >> ipd >> ch >> aNumber >> ch >> bNumber;

stringstream someStringStream;
someStringStream << ipa << "." << ipb << "." << ipc << "." << ipd;
string someString( someStringStream.str() );
2
ответ дан 2 December 2019 в 06:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: