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


Автор: Denzel666 16.12.2006, 01:28
Приветствую мозговой центр сети интернет...Призываю откликнуться на просьбу...Поступила задача на сравнение 2-х строк ...Сравнивание производить по буквам,цифрам и пробелам...(Язык Си)...решение нужно как воздух...Если же программерам в косяк написать пару строк проги, буду рад хотя бы алгоритму решения...По моим соображениям в строках надо удалить все символы не относящиеся к символам указанным в задаче,а затем производить сравнение непосредственно строк с символами относящимися к поставленной задаче...если это не так просьба поправить меня...

Автор: Oleg_Ci 16.12.2006, 08:17
Код

#include <stdio.h>
#include <ctype.h>

bool cmp( const char * c1, const char * c2 ){// функция сравнения
    for(; *c1 && *c2; c1++, c2++ ){
        for(; !isalnum( *c1 ) && *c1 != ' ' ; c1++ );
        for(; !isalnum( *c2 ) && *c2 != ' ' ; c2++ );
        if( *c1 != *c2 ) break;
    }
    if( !*c1 && !*c2 )
        return true;
    else return false;
}

//_________ MAIN_________________
int main(int argc, char *argv[])
{
    char * c1 = "asdf. g,fds";
    char * c2 = "asd...f.. g{}[[[]f[ds";
    if( cmp( c1, c2 ))
        puts("True"); // строки похожи
    else puts("False"); // непохожи
    getchar();
    return 0;
}

Автор: Rockie 16.12.2006, 16:10
Олег4, это не Си smile

Автор: Oleg_Ci 16.12.2006, 17:00
да, ошибочка вышла smile , тогда так
Код

#include <stdio.h>
#include <ctype.h>

int cmp( const char * c1, const char * c2 ){// функция сравнения
    do{
        for(; !isalnum( *c1 ) && *c1 != ' ' ; c1++ );
        for(; !isalnum( *c2 ) && *c2 != ' ' ; c2++ );
    }while( *c1++ == *c2++ && *c1 && *c2 );
    return !( *c1 + *c2 ); 
} // можно так - return *c1 + *c2   ...   if( !cmp( c1, c2 )) // <<

int main(int argc, char *argv[])
{
    char * c1 = "asdf. g,fds";
    char * c2 = "asd...f.. g{}[[[]f[ds";
    if( cmp( c1, c2 )) // <<
        puts("True");
    else puts("False");
    getchar();
    return 0;
}

Автор: Denzel666 17.12.2006, 02:43
здесь как видите сравниваются строки...но это неверное решение...мне необходимо сравнить 

строки...равенство возможно лишь в том случае если длина строк одинакова и одинаково 

расположение элементов(символов) в строке...подскажите что не так...

Автор: Oleg_Ci 17.12.2006, 08:52
А так ?
Код

#include <stdio.h>
#include <ctype.h>

int cmp( const char * c1, const char * c2 ){
    for(; *c1 && *c2 && !(( isalnum( *c1 ) && isalnum( *c2 ) || *c1 == ' ' || *c2 == ' ' ) && *c1 != *c2 ); c1++, c2++ );
    return !( *c1 + *c2 );
}

int main(int argc, char *argv[])
{
    // две "равные" строки
    char * c1 = "s-f g.2"; 
    char * c2 = "s[f g]2";

    if( cmp( c1, c2 ))
        puts("True");
    else puts("False");
    getchar();
    return 0;
}

Автор: Denzel666 18.12.2006, 01:37
не очень понятен алгоритм...с этим проблема всегда была...


Автор: Denzel666 18.12.2006, 02:32
int strcmp(char s[],char t[])
{
18/12/2006)
for (;*s==*t;s++,t++*)
if(*s='\0')
return 0;
return *s-*t;
}

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

Добавлено @ 02:34 
18/12/2006)-вот эта строчка лишняя как вы понимаете

Автор: cardinal 18.12.2006, 02:36
Цитата(Denzel666 @  18.12.2006,  00:32 Найти цитируемый пост)
Возможно ли переделать вот это в чудо в требуемое? 

Не понял суть проблемы? Ты не понимаешь, что вам препод написал или эта функция делает не то, что нужно?

p.s. пользйуся тегами "код"!

Автор: semi 18.12.2006, 05:45
алгоритм говоришь... smile а если так:
проверяем, равны ли строки по длине.  если нет -> ответ отрицательный. 
если да -> проверяем вхождение строки 1 в строку 2. (там же была вроде стандартная функция, проверяющая наличие подстроки в строке). ну... и соответственно, если возвращает 1 (номер символа с которого начинается подстрока) то ответ положительный, а если null (или что она там возвращает в случае неудачи, не помню...) то отрицательный.

Олег4 даже не представляю, как он будет защищать лабу с твоим кодом, если даже не понимает что препод объяснял... smile

Автор: Oleg_Ci 18.12.2006, 15:00
Вот попроще функция, только делает то что я понял в задании smile 
Код

int cmp( const char * c1, const char * c2 ){// функция сравнения
    do{
        if( isalnum( *c1 ) && isalnum( *c2 )) // если это символ или цыфра
        {    if( *c1 != *c2 ) break;    } // и они не равны - то выход

        else if( *c1 == ' ' || *c2 == ' '  ) // если хоть один пробел
            if( *c1 != *c2 ) break; // и они не равны - то выход

/* если не символ алфавита и не цифра и не пробел то пропускаем 
этот символ и продолжаем цикл */

    }while( *c1++ && *c2++ );

    return !( *c1 + *c2 ); 
}

Автор: Denzel666 19.12.2006, 00:19
3:                      if( isalnum( *c1 ) && isalnum( *c2 )) // если это символ или цыфра

Вот это не понятно...Что такое  isalnum?Все непонимание на мамом деле в этой строчке кода...Это в лекциях нет...поэтому сетую на препода...

Добавлено @ 00:28 
Попробую изложить задачу на примере...Допустим даны 2 строки :
a df="2
и
a df="t2
По условию они сразу же не равны так как имеют разную длину...
a df="2
и
a df="2
В этом же случае если литеры "a" и в 1-ом и во 2-ом стринге  находятся  на одном и том же месте , и та же история с остальными символами, т.е. их коды и адрес в строках совпадают , при этом длины строк равны, только в этом случае они равны...


Автор: Denzel666 19.12.2006, 00:45
Код

int strcmp(char s[],char t[])
{
for (;*s==*t;s++,t++*)
if(*s='\0')
return 0;
return *s-*t;
}


подскажите пожалуйста как работает эта функция...


M
alexeis1
Модератор: Выделяйте пожалуйста код. http://forum.vingrad.ru/index.php?showtopic=126445

Автор: cardinal 19.12.2006, 02:17
Цитата(Denzel666 @  18.12.2006,  22:19 Найти цитируемый пост)
Что такое  isalnum?

Функция, которая делает проверку на см. комментарий справа от исп. функции.
Цитата(Denzel666 @  18.12.2006,  22:45 Найти цитируемый пост)
подскажите пожалуйста как работает эта функция... 

Для начала прочитай о том, что такое указатели...

Автор: Oleg_Ci 19.12.2006, 17:10
Цитата(Denzel666 @  19.12.2006,  03:45 Найти цитируемый пост)
подскажите пожалуйста как работает эта функция...

Это сравнение двух строк, причём сравнивает все символы, а ты задание такое написал
Цитата(Denzel666 @  16.12.2006,  04:28 Найти цитируемый пост)
Сравнивание производить по буквам,цифрам и пробелам

Тебе обычное сравнение нужно или сравнение только по буквам,цифрам и пробелам ???

Код

int strcmp( const char * s, const char * t )
{
 for (;*s==*t; s++,t++) // перебираем все символы в обоих строках, и если "читаемые" символы равны то ...
  if(*s='\0') // ...если достигли конца строки то...
   return 0; // ...то строки равны

 return *s-*t; // на сколько строки "неравны"
}
это функция в книге " Б. Керниган, Д. Ритчи    Язык программирования Си  Издание 3-е"
описана, там глава про указатели, почитай smile 

( isalnum != 0 ) если это символ или цыфра

Автор: Denzel666 20.12.2006, 00:25
Цитата

Тебе обычное сравнение нужно или сравнение только по буквам,цифрам и пробелам ???

По буквам цифрам и пробелам...а про  isalnum так и не понял...это стандартная ф-ция?

Автор: cardinal 20.12.2006, 00:29
Первое, что выплевывает google...
http://www.elook.org/programming/c/isalnum.html

Автор: Oleg_Ci 20.12.2006, 19:50
http://www.chipprog.ru/usr-cgi/emuldescr.cgi?PI=PICE-MC&ANCH=923 или http://cpp2.narod.ru/L4.htm#2, а http://www.rambler.ru/srch?set=www&words=%F4%F3%ED%EA%F6%E8%FF+isalnum&btnG=%CD%E0%E9%F2%E8%21

isalnum - библиотечная функция

Автор: Denzel666 21.12.2006, 01:22
Цитата

Функция, которая делает проверку на см. комментарий справа от исп. функции.


это стандартная ф-ция isalnum?

Олег4 , можно попросить ссылку на книгу эту(и)?

Автор: cardinal 21.12.2006, 02:56
Цитата(Denzel666 @  20.12.2006,  23:22 Найти цитируемый пост)
Олег4 , можно попросить ссылку на книгу эту(и)? 

У меня такое впечатление, что ты и слово "библиотека" неправильно понимаешь... smile 

Автор: V.A.KeRneL 21.12.2006, 10:18
1) Ссылки на страницы руководства (man-страницы): 
    
    a) isalnum(): 
        * in english: http://www.opengroup.org/onlinepubs/007908799/xsh/isalnum.html
        * in russian: http://www.opennet.ru/man.shtml?topic=isalnum&category=3&russian=0
    
   b) strcmp()
        * in english: http://www.opengroup.org/onlinepubs/007908799/xsh/strcmp.html
        * in russian: http://www.opennet.ru/man.shtml?topic=strcmp&category=3&russian=0

2) Denzel666, всё-таки я тебя не пойму! Если уж объясняешь на примерах, то объясняй на них до конца, так чтоб очевидно понятно стало, что именно нужно!

Что должна возвращать требуемая тебе функция на следующих «тестах»: 
ans_strcmp( "123 abc", "123abc" );  //=> Тут, ясен пень, 0, т.е. равны.
ans_strcmp( "123 abc", "123 +abc" );  //=> Тут, тоже понятно, ненулевое значение, т.е. неравны.
ans_strcmp( "123-ab c", "123+ab c" );  // А тут что?
ans_strcmp( "123 ab\"c", "123 ab\\c" );  // И тут?
?

В последнем случае длины строк равны, все цыфры, буквы и пробелы одинаковы и стоят на одинаковых позициях, что по твоей изначальной спецификации, вроде, должнен получиться 0 (равны). Функция strcmp() из стандартной библиотеки C для таких паратетров вернёт ненулевое значение (неравны).

Так что именно тебе нужно?!.

Автор: Rockie 21.12.2006, 14:13
Цитата(cardinal @  21.12.2006,  02:56 Найти цитируемый пост)
У меня такое впечатление, что ты и слово "библиотека" неправильно понимаешь...  smile  

smile

Автор: Oleg_Ci 21.12.2006, 17:40
Цитата(Denzel666 @  21.12.2006,  04:22 Найти цитируемый пост)
это стандартная ф-ция isalnum?

да.
Цитата(Denzel666 @  21.12.2006,  04:22 Найти цитируемый пост)
Олег4 , можно попросить ссылку на книгу эту(и)?

http://forum.vingrad.ru/topic-33456.html
8 ссылка smile 

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