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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C] Поиск подстроки в строке 
:(
    Опции темы
mossad
Дата 24.12.2008, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброго времени суток, уважаемые Программисты. У меня задачка с кучей ньюансов. 

Точная формулировка:

Написать программу, осуществляющую  поиск  образца  в  текстовых  строках.

Описание:

Вводится последовательность не более 5 строк длиной не более 67 символов. Окончание входного текста - ввод строки,
начинающейся  символом ";".  После  этого  вводится строка-образец для поиска в тексте. 
Затем осуществляется обработка - поиск образца в строках текста.
При  этом на экран выводится очередная строка текста для поиска, 
в случае неудачи поиска - на следующей строке сообщение об этом, начинающееся  с  символов  "*****".
В случае успеха найденный в строке текста образец закрашивается другим цветом и пользователь 
запрашивается  о продолжении поиска в той же строке или переходе к  поиску  в  следующей  строке  текста. 
Указанная   процедура повторяется для всех строк текста.

УКАЗАНИЯ: 

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


Текущее состоянее кода:

Код

#include <STDIO.H>
#include <CONIO.H>
#include <STRING.H>


void main    ( void );
void Title   ( char *txt );
char *StrGet ( char *text,
           char buf[],
           unsigned len
         );
int YesNo ( char *msg );
void Finish ( char *final );



#define STRMAXLEN 67
#define SBUFLEN ( STRMAXLEN - 2 )

char Str [6][ SBUFLEN ];

int Line_count = 0;


char *BEGIN = "\nProgramm seacher";
char *TEXT  = "\nType text";
char *QUERY = "\nRepeat";
char *FINAL = "\nWork is finished!";


void main ( void )
{
  do{
    Title  ( BEGIN );
    StrGet("Type text:\n\r", Str[Line_count++], SBUFLEN );
  } while ( Line_count<6 && YesNo ( QUERY ) );
    Finish ( FINAL );
}


void Title ( char *txt )
{
    cprintf( "\n\r%s", txt );
    fflush ( stdin );
}

char* StrGet ( char *text,
           char buf[],
           unsigned len
         )
{
    cprintf ("\n\r%s", text );
    buf [0] = ( len > STRMAXLEN ) ? STRMAXLEN: len;
    cgets ( buf );
    if ( buf [1] == 0)
        return NULL;
    else
        return buf+2;
}






int YesNo ( char *msg )
{
int c;

    cprintf( "\n\r%s [Y/N]? ", msg );
    fflush( stdin ); 
    c = getchar();
    if ( (c == 'y') || (c == 'Y') )
        return 1;
    else
        return 0;
}

void Finish ( char *final )
{
    cprintf ( "\n\r%s", final );
}






Постарался как можно точнее. Ребят очень нужна прога. Заранее огромное спасибо.)
PM MAIL   Вверх
mossad
Дата 26.12.2008, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



неужели это сложная задача, может я что недописал? Пожалуйста ребят очень нужен. Ситуация очень плохая, помогите плиз...
PM MAIL   Вверх
taiven
Дата 28.12.2008, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



могу предложить вот такое безобразие:
Код

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void setcolor(unsigned int color)
{
    HANDLE hConsole;
    hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hConsole, color);
}

int main()
{
    char ch, answer, *p;
    char str[5][67] = {'\0'},  search_str[67] = {'\0'};
    unsigned int str_n = 0, symbol_n = 0;
    unsigned int i = 0, k = 0, n = 0;

    setcolor(7);

    //обработка текста--------------------------------------------------
    printf("%s\n", "Input text:");
    while(str_n < 5)
    {
        ch = getchar();
        if(symbol_n == 0 && ch == ';') break;
        str[str_n][symbol_n++] = ch;
        if(ch == '\n'){ ++str_n; symbol_n = 0; }
        if(symbol_n > 66) { printf("error: too many characters in string.\n"); exit(1); }
    }
    //обработка искомой строки-------------------------------------------
    symbol_n = 0;
    fflush(stdin);
    printf("%s\n", "Input substring to search:");
    for(;;)
    {
        ch = getchar();
        if(ch == '\n') break;
        search_str[symbol_n++] = ch;
        if(symbol_n > 66) { printf("error: too many characters in string.\n"); exit(1); }
    }
    if(!strlen(search_str)){ printf("error: substring to search is empty!"); exit(1);};
    
    //поиск--------------------------------------------------------------
    printf("\n========================================================\n");
    for(n = 0; n < str_n; n++)
    {
        setcolor(10);
        printf("%s%d: %s", "string ", n+1, str[n]);
        p = str[n];

        while(*p)
        {
            if((p = strstr(p, search_str)) != NULL)
            {
                for(i = 0; i < strlen(str[n]); i++)
                {
                    if(&(str[n][i]) == p)
                    {
                        setcolor(14);
                        for(k = 0; k < strlen(search_str); k++) printf("%c", str[n][i++]);
                        --i;
                    }
                    else
                    {
                        setcolor(7);
                        printf("%c", str[n][i]);
                    }
                }

                label:
                    printf("Continue search in this string[y/n]: ");
                    fflush(stdin);
                    answer = getchar();
                    if(answer == 'y') p += (strlen(search_str));
                    else if(answer == 'n') break;
                else goto label; 

             }
             else
             {
                setcolor(7);
                printf("*****Substring not found.\n");
                break;
             }
        }
    }

    system("pause");
    return 0;
}

работоспособность не гарантирую  smile 

Это сообщение отредактировал(а) taiven - 28.12.2008, 16:20
PM   Вверх
mossad
Дата 31.12.2008, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



спасиб большое за ответ , проблемы такие: не находит библиотеку windows, если пока убрать смену цвета, то компилится, но дает ввести только 67 символов, потом переводит на следующую строку принимает половину строки дальше не берет((( Не знаю в чем беда(( 
PM MAIL   Вверх
taiven
Дата 31.12.2008, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mossad @  31.12.2008,  12:57 Найти цитируемый пост)
не находит библиотеку windows

компилятор какой используешь? 
Цитата(mossad @  31.12.2008,  12:57 Найти цитируемый пост)
но дает ввести только 67

ну, судя по заданию там и должно быть возможно ввести только 67 символов в каждой строке(я так понимаю). Если в строке их больше, то программа завершается...
PM   Вверх
mossad
Дата 3.1.2009, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

потом переводит на следующую строку принимает половину строки дальше не берет


вот в чем беда  а там вродь должно быть как
вводятся 67 символов потом автоматом переходит на следующую строку и так максимум пять раз(( а он доезжает до середины второй((.
спасиб что помогаешь))
PM MAIL   Вверх
taiven
Дата 3.1.2009, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mossad @  3.1.2009,  10:52 Найти цитируемый пост)
вводятся 67 символов потом автоматом переходит на следующую строку и так максимум пять раз(( а он доезжает до середины второй((.

можешь конечно попробовать использовать функцию getche(), но не знаю, чем тебе не подходит нажимать <ENTER> после ввода каждой строки?
PM   Вверх
mossad
Дата 3.1.2009, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



просто не знаю чего препод от меня потребует((  он вообще машина к каждому пробелу придерается((( Спасибо большое что помог, сам бы не разгреб)) С Новым годом)) удачи) 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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