Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C]Поиск вхождения слова


Автор: Hersio 10.12.2006, 09:12
Вообщем дана последовательность слов через запятые, заканчивающееся точкой. Нужно вычислить все слова начинающиеся на "cam". Пример:
camin,cams,caer,sgsgsg.
Вывод: camin
            cams

Я тут чото пытался сделать, но не получаеться помогите найти ошибку?smile
Код

#include<stdio.h>
#include<conio.h>
#include<string.h>
int y(const char* a, const char* b){
int count=0, i=0, j=0;
for(;a[i]!='\0';i++){
for(;a[i]==b[j];i++,j++);
//for(;a[i]!=','&&a[i]!='.'&&b[j]=='\0';i++)
if((a[i]==','||a[i]=='.')&&b[j]=='\0')count++;
else
for(;a[i]!=','||a[i]!='.';i++);
j=0;
}
return count;
}
int main()
{clrscr();
char str[271],*strcp="cam";
printf("BBeguTe nocledov. clov\n");
gets(str);
//strcpy(strcp,str);
char* delims=".,";
char* p;
int flag=0;
p=strtok(str, delims);
printf("\nSlovo cam vstre4aetcya v slovax: \n\n");
while(p)
{
if(y(p,strcp)==1){
printf("%s\n",p);
flag=1;
}
p=strtok(NULL, delims);
}
if(flag==0)printf("HeTy Takux Clov!");
getch ();
return 0;
}



M
alexeis1
Модератор: не забывайте выбирать тип подсветки.

Автор: Oleg_Ci 10.12.2006, 11:00
Другую функцию сравнения я написал, а функция main проктически без изменений.
Код

#include<stdio.h>
//#include<conio.h>
#include<string.h>

int cmp(const char* a, const char* b){
    int count=0;
    while( *a == ' ' ) a++; // пропуск пробелов
    while( *a++ == *b++ )
        count++;
    return count;
}
/////////////// main ///////////////////
int main(int argc, char *argv[])
{ 
    char str[271], *strcp="cam";
    printf("BBeguTe nocledov. clov\n");
    gets(str);
    char* delims=".,";
    char* p;
    int flag=0;
    p=strtok(str, delims);
    printf("\nSlovo cam vstre4aetcya v slovax: \n\n");
    while(p)
    {
        if( cmp(p,strcp)==3 ){ // если слово начинается с "cam"
            printf("%s\n",p);
            flag=1;
        }
        p=strtok(NULL, delims);
    }
    if(flag==0) printf("HeTy Takux Clov!");

    fflush(stdin);
    getchar(); // пауза
    return 0;
}

Автор: Hersio 10.12.2006, 11:22
Олегыч спасиюоsmile Ток объясни вот эту штуку  while( *a == ' ' ) a++; 

Автор: Hersio 10.12.2006, 11:48
И ещё Олегыч ты бы не мог мне помочь с задачей на подключение файла, редоктирование его и создание нового файла из редактирования?

Автор: Oleg_Ci 10.12.2006, 11:53
Код

while( *a == ' ' ) a++; // пропуск пробелов
Если не нужна то убери.
Делалась на случай если пользователь вводит строку с пробелами после запятых.
представь если ввели "слово1,слово2." - пробела нет значит цикл ненужен, а если ввели "слово1,   слово2." - с пробелами, то получается что в сравнении учавствуют символы не начала слова, эти самые пробелы.
Вобщем надо для того, чтоб указатель постовить на начало слова.

Добавлено @ 11:56 
Цитата(Hersio @  10.12.2006,  14:48 Найти цитируемый пост)
И ещё Олегыч ты бы не мог мне помочь с задачей на подключение файла, редоктирование его и создание нового файла из редактирования?

могу smile 
только лучше новую тему создай, чтоб модераторы не ругались
мол правило такое - "один топик один вопрос !"

Автор: Dov 11.12.2006, 10:11
Цитата(Олег4 @  10.12.2006,  10:00 Найти цитируемый пост)
Другую функцию сравнения я написал

А зачем вообще её писать? Такая ф-ция уже существует и называется она strncmp. Поэтому вместо строки
Код
 if( cmp(p,strcp)==3 ){ // если слово начинается с "cam"

достаточно написать так
Код
if( !strncmp(p, strcp, 3)){ // если слово начинается с "cam"

И ещё можно в разделители добавить пробел: 
Код
 char* delims=" .,";




Автор: Oleg_Ci 11.12.2006, 17:18
Dov, ну блин точно подметил smile 
а я сразу сунулся в коде ошибки исправлять неподумавши.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)