Автор Тема: Сравняване на низове в С++  (Прочетена 3594 пъти)

console

  • Напреднали
  • *****
  • Публикации: 243
    • Профил
    • WWW
Сравняване на низове в С++
« -: Aug 14, 2007, 18:19 »
Здравейте!

Уча по един учебник от 98 година.В него пише следното:

Примерен код
В С++ най-напред са цифрите,след тях идват главните букви и най-накрая са малките букви(буквите са наредени по азбучен ред).Например 1 е преди В, което пък е преди а.


С оглед на това което пише следната програмка
Примерен код

#include <iostream>
#include <string>
using namespace std;
int main ()
string word,word1;
cout<<"Enter two strings: \n";
cin>>word>>word1;
if (word>word1)
{
cout<<word <<"\n";
}
else
{
cout<<word1 <<"\n";
}
return 0;
}
 

би трябвало да изведе този резултат:

Примерен код
Enter two strings:a b
а

Обаче се получава точно обратното:
Примерен код

$ ./a.out
Enter two strings:
a b
b



Защо се получава така?Така излиза ,че не са подредени по азбучен ред а точно обратното ':xclam:'



Активен

“Ever tried. Ever failed. No matter. Try again. Fail again. Fail Better.”

dvanaise

  • Напреднали
  • *****
  • Публикации: 74
  • Distribution: Debian
  • Window Manager: KDE, LXDE
    • Профил
Сравняване на низове в С++
« Отговор #1 -: Aug 14, 2007, 18:53 »
a+1=b
=> b>a
=>if връща false
=> изписва b
пробвай с a и B

mom

  • Напреднали
  • *****
  • Публикации: 266
  • Distribution: Ubuntu
  • Window Manager: Compiz
    • Профил
Сравняване на низове в С++
« Отговор #2 -: Aug 14, 2007, 19:29 »
Баш по азбучен ред са си! Програмата ти е вярна и прави точно каквото трябва, а именно 'a' < 'b'. Най-напред означава в началото са цифрите, после главните букви после малките, т.е. тези, които са по-отпред, имат по-малки номера в кодовата таблица => подредбата е възходяща => 'a' < 'b'
Активен

the_real_maniac

  • Напреднали
  • *****
  • Публикации: 1258
  • Kernel panic, me - no panic ;-) :-)
    • Профил
Сравняване на низове в С++
« Отговор #3 -: Aug 14, 2007, 19:54 »
Само да кажа, че според мен да ползваш string Не е много ок , нищо че го има '<img'> :-)

Прилича ми нa BASIC/visual basic Програма.

Спестяваш си време за нищо , а после като усложниш и ... по български ще духаш супата. КАзвам го сега и така, защото ти тепърва се учиш
нищо няма да ти пречи да дефинираш стринг с char

char test[] = " ... " ;
char *test = " ... " ;

;-)

Успех ':p' :-)
Активен

Powered by Debian GNU / LINUX /// Intel inside ...

„Насилието е последното убежище на некомпетентността“ - Айзък Азимов (1920 — 1992)

Nikolavp

  • Напреднали
  • *****
  • Публикации: 408
    • Профил
    • WWW
Сравняване на низове в С++
« Отговор #4 -: Aug 15, 2007, 02:12 »
Не че много разбирам от програмиране, но какъв е начина да "вкара" променлива от тип char bla[] или char *bla, ако не е задал "дължината" на низа. Аз бих го направил също със string и ще бъде нещо подобно
Примерен код

#include <iostream>
#include <string.h>

using namespace std;

void compare(const string word,const string word1);


int main( int argc, char *argv[] )
{
        if (argc == 3){
                compare(*(argv+1), *(argv+2));
        }else {
                string word, word1;
                cout << "Please enter two strings: ";
                cin >> word >> word1;
                compare(word, word1);
        }
}

void compare(const string word,const string word1){
        if (word < word1){
                cout << word << endl;
        } else {
                cout << word1 << endl;
        }
}




Активен

http://blog-nikolavp.rhcloud.com - простотиите, с които се занимавам в свободното време

dvasilev

  • Напреднали
  • *****
  • Публикации: 200
  • Distribution: Kubuntu, Debian
  • Window Manager: KDE
    • Профил
    • WWW
Сравняване на низове в С++
« Отговор #5 -: Aug 15, 2007, 09:31 »
//offtopic

@the_real_maniac: Като гледам още малко ще дадеш съвет на човека да се фокусира на C и да зареже ООП за да не духа супата ;-)
Активен

paucku

  • Напреднали
  • *****
  • Публикации: 638
  • Distribution: Kubuntu LTS (отскоро е - тествам я в момента)
  • Window Manager: KDE
  • Райчо Николов
    • Профил
    • WWW
Сравняване на низове в С++
« Отговор #6 -: Aug 15, 2007, 10:32 »
string е клас а word и word1 са обекти. Така че не е ясно точно какво сравняваш със следния израз:
Примерен код
word>word1
Може да сравнява адресите на двете променливи в паметта.

За да сравняваш стрингове от клас string, трябва да ползваш методите на този клас а не ">" или "<", защото най-вероятно тези оператори не са предефинирани за стрингови обекти.
Активен

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Сравняване на низове в С++
« Отговор #7 -: Aug 15, 2007, 10:41 »
Цитат
какъв е начина да "вкара" променлива от тип char bla[] или char *bla, ако не е задал "дължината" на низа


Ъм, тоест?
Активен

"Knowledge is power" - France is Bacon

Nikolavp

  • Напреднали
  • *****
  • Публикации: 408
    • Профил
    • WWW
Сравняване на низове в С++
« Отговор #8 -: Aug 15, 2007, 10:43 »
Цитат (gat3way @ Авг. 15 2007,11:41)
Цитат
какъв е начина да "вкара" променлива от тип char bla[] или char *bla, ако не е задал "дължината" на низа


Ъм, тоест?

Тоест прост cin >>
Активен

http://blog-nikolavp.rhcloud.com - простотиите, с които се занимавам в свободното време

the_real_maniac

  • Напреднали
  • *****
  • Публикации: 1258
  • Kernel panic, me - no panic ;-) :-)
    • Профил
Сравняване на низове в С++
« Отговор #9 -: Aug 15, 2007, 10:44 »
Цитат (dvasilev @ Авг. 15 2007,10:31)
//offtopic

@the_real_maniac: Като гледам още малко ще дадеш съвет на човека да се фокусира на C и да зареже ООП за да не духа супата ;-)

offtopic:

Ти пък ...  ':p' Лични предпочитания изразявам :-) '<img'>
Активен

Powered by Debian GNU / LINUX /// Intel inside ...

„Насилието е последното убежище на некомпетентността“ - Айзък Азимов (1920 — 1992)

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Сравняване на низове в С++
« Отговор #10 -: Aug 15, 2007, 11:03 »
Не си падам много по С++, а тези streamed I/O глупости ми се виждат изключително недодялани. printf/scanf какво толкова не ви харесва?

И все пак, за каква дължина на низа става въпрос?
Активен

"Knowledge is power" - France is Bacon

Nikolavp

  • Напреднали
  • *****
  • Публикации: 408
    • Профил
    • WWW
Сравняване на низове в С++
« Отговор #11 -: Aug 15, 2007, 11:09 »
Ако зададеш дължината на низа, при инициализирането, след това можеш да и променяш стойността с cin >> . Така неща от рода на:
Примерен код

.....
char hello[20];
std::cin >> hello;
std::cout << hello << std::endl;
....
работят.
Активен

http://blog-nikolavp.rhcloud.com - простотиите, с които се занимавам в свободното време

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Сравняване на низове в С++
« Отговор #12 -: Aug 15, 2007, 11:12 »
Дължината, в смисъл?

Ако въведеш 25 символа например, програмата няма да изгърми?
Активен

"Knowledge is power" - France is Bacon

Nikolavp

  • Напреднали
  • *****
  • Публикации: 408
    • Профил
    • WWW
Сравняване на низове в С++
« Отговор #13 -: Aug 15, 2007, 11:25 »
Цитат (gat3way @ Авг. 15 2007,12:12)
Дължината, в смисъл?

Ако въведеш 25 символа например, програмата няма да изгърми?

До колкото знам, изобщо не е хубаво да си играеш с обекти, които са с индекс по - голям от този, който си задал на масива. Даже програмата излиза неправомерно.
Примерен код

nikolavp@Nikolavp ~ $ cat main.cpp
#include <iostream>

using namespace std;

int main()
{
        char hello[2];
        cin >> hello;
        cout << hello << endl;
}


nikolavp@Nikolavp ~ $ g++ main.cpp
nikolavp@Nikolavp ~ $ ./a.out
sadsa
sadsa
Segmentation fault
nikolavp@Nikolavp ~ $ echo $?
139




Активен

http://blog-nikolavp.rhcloud.com - простотиите, с които се занимавам в свободното време

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Сравняване на низове в С++
« Отговор #14 -: Aug 15, 2007, 11:36 »
Да де, това исках да ти кажа, тъпчеш в една променлива, за която си заделил 2 байта - 6-7 някъде. Съответно тези променливи се пазят в стека, на края на който се пази адреса на който програмата трябва да продължи, излизайки от функцията. Като помажеш този адрес с "asdf", програмата продължава от някакъв адрес на майната си и най-вероятно гърми със segfault '<img'>

Иначе що се отнася до "дължина" на стринга - много е просто. Стринговете се терминират с \0. "Позицията" на тази нула, спрямо "началото" на стринга (т.е адреса на char *bla) се води "дължина" на стринга. Така теоретично стринга може да бъде много голям. Всъщност това понякога води до доста проблеми, но като идея си е много по-добре от паскал-ския подход например, където стринговете са масиви и нулевият елемент на масива "държи" дължината на стринга '<img'>
Активен

"Knowledge is power" - France is Bacon