Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: console в Aug 14, 2007, 18:19



Титла: Сравняване на низове в С++
Публикувано от: console в 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:





Титла: Сравняване на низове в С++
Публикувано от: dvanaise в Aug 14, 2007, 18:53
a+1=b
=> b>a
=>if връща false
=> изписва b
пробвай с a и B


Титла: Сравняване на низове в С++
Публикувано от: mom в Aug 14, 2007, 19:29
Баш по азбучен ред са си! Програмата ти е вярна и прави точно каквото трябва, а именно 'a' < 'b'. Най-напред означава в началото са цифрите, после главните букви после малките, т.е. тези, които са по-отпред, имат по-малки номера в кодовата таблица => подредбата е възходяща => 'a' < 'b'


Титла: Сравняване на низове в С++
Публикувано от: the_real_maniac в Aug 14, 2007, 19:54
Само да кажа, че според мен да ползваш string Не е много ок , нищо че го има ;) :-)

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

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

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

;-)

Успех :p :-)


Титла: Сравняване на низове в С++
Публикувано от: Nikolavp в 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;
        }
}






Титла: Сравняване на низове в С++
Публикувано от: dvasilev в Aug 15, 2007, 09:31
//offtopic

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


Титла: Сравняване на низове в С++
Публикувано от: paucku в Aug 15, 2007, 10:32
string е клас а word и word1 са обекти. Така че не е ясно точно какво сравняваш със следния израз:
Примерен код
word>word1
Може да сравнява адресите на двете променливи в паметта.

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


Титла: Сравняване на низове в С++
Публикувано от: gat3way в Aug 15, 2007, 10:41
Цитат
какъв е начина да "вкара" променлива от тип char bla[] или char *bla, ако не е задал "дължината" на низа


Ъм, тоест?


Титла: Сравняване на низове в С++
Публикувано от: Nikolavp в Aug 15, 2007, 10:43
Цитат (gat3way @ Авг. 15 2007,11:41)
Цитат
какъв е начина да "вкара" променлива от тип char bla[] или char *bla, ако не е задал "дължината" на низа


Ъм, тоест?

Тоест прост cin >>


Титла: Сравняване на низове в С++
Публикувано от: the_real_maniac в Aug 15, 2007, 10:44
Цитат (dvasilev @ Авг. 15 2007,10:31)
//offtopic

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

offtopic:

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


Титла: Сравняване на низове в С++
Публикувано от: gat3way в Aug 15, 2007, 11:03
Не си падам много по С++, а тези streamed I/O глупости ми се виждат изключително недодялани. printf/scanf какво толкова не ви харесва?

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


Титла: Сравняване на низове в С++
Публикувано от: Nikolavp в Aug 15, 2007, 11:09
Ако зададеш дължината на низа, при инициализирането, след това можеш да и променяш стойността с cin >> . Така неща от рода на:
Примерен код

.....
char hello[20];
std::cin >> hello;
std::cout << hello << std::endl;
....
работят.


Титла: Сравняване на низове в С++
Публикувано от: gat3way в Aug 15, 2007, 11:12
Дължината, в смисъл?

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


Титла: Сравняване на низове в С++
Публикувано от: Nikolavp в 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






Титла: Сравняване на низове в С++
Публикувано от: gat3way в Aug 15, 2007, 11:36
Да де, това исках да ти кажа, тъпчеш в една променлива, за която си заделил 2 байта - 6-7 някъде. Съответно тези променливи се пазят в стека, на края на който се пази адреса на който програмата трябва да продължи, излизайки от функцията. Като помажеш този адрес с "asdf", програмата продължава от някакъв адрес на майната си и най-вероятно гърми със segfault :)

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


Титла: Сравняване на низове в С++
Публикувано от: v_badev в Aug 15, 2007, 14:22
в съвременните версии на Pascal (Object Pascal след версия 3) стринга пак може да е колкото си искаш голям, и не можеш с просто присвояване да омажеш стека.

@Nikolavp Точно за да си нямаш проблеми с като този който си демонстрирал е хубаво да ползваш класа string когато работиш с входно-изходната библиотека на C++. Ако искаш да ползваш указатели към char по-добре ползвай scanf и изрично му указвай колко байта да чете. В твоят пример четенето ще стане така:
Примерен код
#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
        /*инициализиране на елементите на масива с 0*/
        char hello[3] = {0};
        scanf("%2c", hello);
        cout << hello << endl;
}

Друг е въпроса че това вече не прилича кой-знае колко на програма на C++.


Титла: Сравняване на низове в С++
Публикувано от: gat3way в Aug 15, 2007, 15:49
Мммм има по-забавен начин да не се тормозиш за дължината на това, което се въвежда. Ето така:

Цитат


char *str;
...
scanf("%as",&str);



По този начин, scanf() заделя автоматично памет в зависимост от дължината на въведеният низ. Единствената грижа е после тази памет да се освободи c free().





Титла: Сравняване на низове в С++
Публикувано от: Nikolavp в Aug 15, 2007, 18:40
Цитат (v_badev @ Авг. 15 2007,15:22)
в съвременните версии на Pascal (Object Pascal след версия 3) стринга пак може да е колкото си искаш голям, и не можеш с просто присвояване да омажеш стека.

@Nikolavp Точно за да си нямаш проблеми с като този който си демонстрирал е хубаво да ползваш класа string когато работиш с входно-изходната библиотека на C++. Ако искаш да ползваш указатели към char по-добре ползвай scanf и изрично му указвай колко байта да чете. В твоят пример четенето ще стане така:
Примерен код
#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
        /*инициализиране на елементите на масива с 0*/
        char hello[3] = {0};
        scanf("%2c", hello);
        cout << hello << endl;
}

Друг е въпроса че това вече не прилича кой-знае колко на програма на C++.

Всъщност точно затова говорехме и аз го намекнах/показах в ползва на класа стринг, защото the_real_maniac предложи на пича да ползва низове, вместо класа в C++. Със scanf не съм много запознат, защото не съм се занимавал с чисто С.