1

Тема: Видалення зайвих символів.

Добрий вечір.

У мене є декілька питань:
  1. Чи є в середовищі С++ встроєна множина символів (всі символи, окрім літер), яку я можу використати для видалення зайвих символів з тексту;
  2. Якщо такої множини немає, тоді для видалення можна перевіряти символи, якщо символ не входить в заданий інтервал ASCII таблиці, то видаляти його.
Чи все-таки сворювати свою множину символів і перебирати текст посимвольно, видаляючи з нього символи які знаходяться в множині. Яким шляхом це буде швишде?
  3. Якщо все-таки така множина існує, можете підказати назву, чи дати посилання на кокретну статтю, якщо не важко?

Коду програми ще не має, лише невеликий кусочок (це я намагаюсь поступово реалізувати алгоритм Шинглів).

Прихований текст
#include <iostream>
#include <string>

using namespace std;

int main()
{
    string stringText;
    cout << "Input text" << endl;
    getline(cin, stringText);

    const int n = 5;
    string masuv[n];

    for (int i = 0; i < stringText.length(); i++)
        stringText[i] = tolower(stringText[i]);

    cout << stringText << endl;

    cout << endl;
    
    system("pause");
    return 0;
}

2

Re: Видалення зайвих символів.

1. Не існує "середовища C++". Як використовувати символи - то ваші особисті проблеми в C++. До речі, розкрийте таємницю - як "використати множину символів для видалення зайвих символів з тексту"? Звучить як "використати кольори олівців для витирання літер".
2. Можна. Звісно, два порівняння на більше-менше швидші, ніж три десятки порівнянь на "дорівнює"; втім, можна так написати порівняння, що буде довше.
3. Все ж таки, яка множина?
І що можна зрозуміти з цього коду? Тут вводиться рядок і призводиться до нижнього регістру. А що видаляти треба - не зрозуміло.

3

Re: Видалення зайвих символів.

koala написав:

1. Не існує "середовища C++". Як використовувати символи - то ваші особисті проблеми в C++. До речі, розкрийте таємницю - як "використати множину символів для видалення зайвих символів з тексту"? Звучить як "використати кольори олівців для витирання літер".
2. Можна. Звісно, два порівняння на більше-менше швидші, ніж три десятки порівнянь на "дорівнює"; втім, можна так написати порівняння, що буде довше.
3. Все ж таки, яка множина?
І що можна зрозуміти з цього коду? Тут вводиться рядок і призводиться до нижнього регістру. А що видаляти треба - не зрозуміло.

1. За "середовище" вибачаюсь, я мав на увазі середовище Visual Studio 2010. Щодо множини, я мав на увазі множину символів ('/', '.', ',', '?', '!' і т.д.), яка буде використовуватись, як перевірочна для видалення таких символів з тексту.
2. Тобто порівняння по коду ASCII використовувати доцільніше?
3. Див. відп. 1.

Хоч код і не був звязаний з темою, я кидав його, як приклад того, що я хоч щось робив :)

Ось код, який вже в мене є:

Прихований текст
#include <iostream>
#include <string>

using namespace std;

int main()
{
    string stringText;
    string symbols = ",:.;!?\/|";
    
    cout << "Input text" << endl;
    getline(cin, stringText);

    const int n = 5;
    string masuv[n];

    // Приведення до нижнього регістру
    for (int i = 0; i < stringText.length(); i++)
        stringText[i] = tolower(stringText[i]);
    
    // Видалення зайвих символів
    for (int i = 0; i < stringText.length(); i++)
        for (int j = 0; j < symbols.length(); j++)
            if (stringText[i] == symbols[j])
            {
                stringText = stringText.erase(i, 1);
                i--;            
            }
    
    // Видалення зайвих пропусків
    for (int i = 0; i < stringText.length(); i++)
        if (stringText[i] == ' ')
        {
            int j;
            j = i + 1;
            while (stringText[j] == ' ')
                stringText.erase(j, 1);
        }
    
    cout << stringText << endl;

    cout << endl;
    
    system("pause");
    return 0;
}

Мені треба оптимізувати видалення зайвих символів, для великого тексту, та передбачити видалення всіх можливих синтаксичних символів.

4

Re: Видалення зайвих символів.

Є стандартні isalpha та strchr. А за множину символів цілком може правити звичайний рядок.

Подякували: Logans1

5

Re: Видалення зайвих символів.

А є можливість використання isalpha для кирилиці? Чи потрібно буде переписувати цю функцію під Кирилицю?

6

Re: Видалення зайвих символів.

Logans написав:

А є можливість використання isalpha для кирилиці? Чи потрібно буде переписувати цю функцію під Кирилицю?

В нових версіях компіляторів C++ - так, є. В <clocale>. Тільки правильно локаль виставте.

Подякували: Logans2