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;
}

"Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program."
- Linus Torvalds

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;
}

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

"Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program."
- Linus Torvalds

4

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

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

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

5

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

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

"Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program."
- Linus Torvalds

6

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

Logans написав:

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

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

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