попросить текст для редактирования, форматирование текста - PullRequest
0 голосов
/ 16 января 2019

Я хотел бы создать программу, которая запрашивает текст (параграф с несколькими словами), который будет разделяться запятыми. Чтобы преобразовать текст и добавить тег между ними, например, отформатировать текст в HTML-текст

Пример: word1, word2, word3 в <a> word1 </a>, <a> word2 </a>, <a> word3 </a>

Итак, я начал делать этот код, но я не знаю, как продолжить. Как я могу проверить текст, чтобы найти начало слова? Я представляю с тестами ASCII? Может быть, с таблицей, которая будет проверять каждый случай?

Я не обязательно спрашиваю полный ответ, но, возможно, поможет направление, которому нужно следовать.

#include <iostream>
#include <iomanip>
#include <string> //For getline()

using namespace std;

// Creating class
class GetText
{
public:
    string text;
    string line; //Using this as a buffer

    void userText()
    {
        cout << "Please type a message: ";

        do
        {
            getline(cin, line);
            text += line;
        }
        while(line != "");
    }

    void to_string()
    {
        cout << "\n" << "User's Text: " << "\n" << text << endl;
    }
};


int main() {
    GetText test;
    test.userText();
    test.to_string();
    system("pause");

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Если вы хотите сохранить простоту, вы можете определять границы слов, проверяя два символа за раз. Вот рабочий пример .

using namespace std;

#include <iostream>
#include <string>

#include <cctype>

typedef enum boundary_type_e {
    E_BOUNDARY_TYPE_ERROR = -1,
    E_BOUNDARY_TYPE_NONE,
    E_BOUNDARY_TYPE_LEFT,
    E_BOUNDARY_TYPE_RIGHT,
} boundary_type_t;

typedef struct boundary_s {
    boundary_type_t type;
    int pos;
} boundary_t;

bool is_word_char(int c) {
    return ' ' <= c && c <= '~' && !isspace(c) && c != ',';
}

boundary_t maybe_word_boundary(string str, int pos) {
    int len = str.length();
    if (pos < 0 || pos >= len) {
        return (boundary_t){.type = E_BOUNDARY_TYPE_ERROR};
    } else {
        if (pos == 0 && is_word_char(str[pos])) {
            // if the first character is word-y, we have a left boundary at the beginning
            return (boundary_t){.type = E_BOUNDARY_TYPE_LEFT, .pos = pos};
        } else if (pos == len - 1 && is_word_char(str[pos])) {
            // if the last character is word-y, we have a right boundary left of the null terminator
            return (boundary_t){.type = E_BOUNDARY_TYPE_RIGHT, .pos = pos + 1};
        } else if (!is_word_char(str[pos]) && is_word_char(str[pos + 1])) {
            // if we have a delimiter followed by a word char, we have a left boundary left of the word char
            return (boundary_t){.type = E_BOUNDARY_TYPE_LEFT, .pos = pos + 1};
        } else if (is_word_char(str[pos]) && !is_word_char(str[pos + 1])) {
            // if we have a word char followed by a delimiter, we have a right boundary right of the word char
            return (boundary_t){.type = E_BOUNDARY_TYPE_RIGHT, .pos = pos + 1};
        }
        return (boundary_t){.type = E_BOUNDARY_TYPE_NONE};
    }
}

int main() {
    string str;
    string ins_left("<tag>");
    string ins_right("</tag>");
    getline(cin, str);

    // can't use length for the loop condition without recalculating it all the time
    for (int i = 0; str[i] != '\0'; i++) {
        boundary_t boundary = maybe_word_boundary(str, i);
        if (boundary.type == E_BOUNDARY_TYPE_LEFT) {
            str.insert(boundary.pos, ins_left);
            i += ins_left.length();
        } else if (boundary.type == E_BOUNDARY_TYPE_RIGHT) {
            str.insert(boundary.pos, ins_right);
            i += ins_right.length();
        }
    }
}

Было бы лучше использовать enum class, но я забыл обозначения. Вы также можете скопировать в буфер вместо генерации новой строки на месте, я просто пытался сохранить ее простотой. Не стесняйтесь расширять его до стиля C ++, основанного на классах. Чтобы получить желаемый результат, сначала удалите пробелы и добавьте пробелы в ins_left и ins_right.

0 голосов
/ 16 января 2019

Следующее, что вам нужно сделать, это разделить ваш ввод с помощью дельтиметра (в вашем случае ',') на вектор, а затем объединить все с префиксами и посфиксами. C ++ не поддерживает разбиение по умолчанию, вам придется проявить творческий подход или искать решение, например здесь .

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