Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужна помощь с программой! Программа фильтрующая строки. 
V
    Опции темы
Roman_M
Дата 4.2.2009, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 18.1.2008

Репутация: нет
Всего: нет



Привет. Не могу понять что не так с кодом. Помогите начинающему.

Код

#include <iostream>
using namespace std;
const int size = 1000;
int main()
{
    void Filter(char[], int, int);
    char str[size];
    char ch = 'y';
    int choice;
    int n;
    cout << "\nEnter text.\n";
    gets(str);
    n = strlen(str) + 1;
    while(ch != 'n')
    {
        cout << "\nEnter the filter: ";
        cin >> choice;
        switch(choice)
        {
        case 1:    Filter(str, n, choice); break;
        case 2:    Filter(str, n, choice); break;
        case 3:    Filter(str, n, choice); break;
        case 4:    Filter(str, n, choice); break;
        default: cout << "\nWrong choice!!!"; break;
        }
        cout << "\nTry again ([y]/[n]): ";
        cin >> ch;
    }
    return 0;
}
void Filter(char ar[], int x, int y)
{
    const char filter1[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    const char filter2[] = "абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";
    const char filter3[] = "1234567890";
    const char filter4[] = ".,-:;!?";
    char far[size];
    char* pfar = far;
    char* p;
    for(int i = 0; i < x; i++)
    {
        pfar[i] = ar[i];
        switch(y)
        {
        case 1: p = strpbrk((pfar + i), filter1); break;
        case 2: p = strpbrk((pfar + i), filter2); break;
        case 3: p = strpbrk((pfar + i), filter3); break;
        case 4: p = strpbrk((pfar + i), filter4); break; 
        }
        if(p != 0) pfar[i] = ' ';
    }
    puts(pfar);
}


Это сообщение отредактировал(а) Roman_M - 4.2.2009, 10:01
PM MAIL   Вверх
zim22
Дата 4.2.2009, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



c кодом всё в порядке. работает как часы.

Это сообщение отредактировал(а) zim22 - 4.2.2009, 11:06


--------------------
PM MAIL   Вверх
andrew_121
Дата 4.2.2009, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Roman_M, Для начала обьясни что за код, что выполняет, и что с ним не так?


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
zim22
Дата 4.2.2009, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



ф-я strpbrk принимает NULL-terminated строки

а передаётся ей просто неинициализированный массив.
Код

char far[size];
char* pfar = far;



--------------------
PM MAIL   Вверх
Roman_M
Дата 4.2.2009, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 18.1.2008

Репутация: нет
Всего: нет



to zim22.
Когда выбираю 2 или 4 фильтр выводится пустая строка.
Значит strpbrk не подходит для программы.
Намекни, пожалуйста, что можно придумать с этой проблемой.

Это сообщение отредактировал(а) Roman_M - 4.2.2009, 11:27
PM MAIL   Вверх
Roman_M
Дата 4.2.2009, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 18.1.2008

Репутация: нет
Всего: нет



to andrew_121

По задумке программа должна "фильтровать" входную строку и выводить на экран отфильтрованный результат.
Я еще не реализовал в ней наложение других "фильтров" и их отмену, потому как застрял (на 3 дня) над проблемой нормального вывода. 
PM MAIL   Вверх
zim22
Дата 4.2.2009, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



измени этот кусок кода
Код
  for(int i = 0; i < x; i++)
    {
        pfar[i] = ar[i];
        switch(y)
        {
        case 1: p = strpbrk((pfar + i), filter1); break;
        case 2: p = strpbrk((pfar + i), filter2); break;
        case 3: p = strpbrk((pfar + i), filter3); break;
        case 4: p = strpbrk((pfar + i), filter4); break; 
        }
        if(p != 0) pfar[i] = ' ';
    }


на этот:
Код
for(int i = 0; i < x; i++)
    {
        pfar[i] = ar[i];
    }
    
    for(int i = 0; i < x; i++)
    {
        switch(y)
        {
        case 1: p = strpbrk((pfar + i), filter1); break;
        case 2: p = strpbrk((pfar + i), filter2); break;
        case 3: p = strpbrk((pfar + i), filter3); break;
        case 4: p = strpbrk((pfar + i), filter4); break; 
        }
        if(p) p[0] = ' ';
    }



и всё заработает, кроме второго фильтра, т.к. он с русским текстом сравниваем. а я не умею с ним работать. 
locale нужно менять вроде...


--------------------
PM MAIL   Вверх
Roman_M
Дата 4.2.2009, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 18.1.2008

Репутация: нет
Всего: нет



zim22, 
Спасибо. smile  Действительно сработало.
Я немного по-другому сделал
Код

strcpy(pfar,ar);


Еще раз спасибо. smile 
PM MAIL   Вверх
GoldFinch
Дата 4.2.2009, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



вместо
Код

    const char filter1[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    const char filter2[] = "абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";
    const char filter3[] = "1234567890";
    const char filter4[] = ".,-:;!?";
...
        switch(y)
        {
        case 1: p = strpbrk((pfar + i), filter1); break;
        case 2: p = strpbrk((pfar + i), filter2); break;
        case 3: p = strpbrk((pfar + i), filter3); break;
        case 4: p = strpbrk((pfar + i), filter4); break; 
        }

лучше
Код

char* filter[4]={
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",
"абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
"1234567890"
".,-:;!?"
};
...
p = strpbrk((pfar + i), filter[y-1]);

а еще лучше избавиться от "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" заменив его проверкой диапазона
и вообще этот код страшен
PM MAIL ICQ   Вверх
Roman_M
Дата 4.2.2009, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 18.1.2008

Репутация: нет
Всего: нет



GoldFinch, 
 smile  smile  smile 
спасибо за ответ.
Может через пару лет и я буду также писать другим... smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0507 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.