Титла: Сравняване на низове в С++ Публикувано от: console в Aug 14, 2007, 18:19 Здравейте!
Уча по един учебник от 98 година.В него пише следното:
С оглед на това което пише следната програмка
би трябвало да изведе този резултат:
Обаче се получава точно обратното:
Защо се получава така?Така излиза ,че не са подредени по азбучен ред а точно обратното ![]() Титла: Сравняване на низове в С++ Публикувано от: 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 = " ... " ; ;-) Успех ![]() Титла: Сравняване на низове в С++ Публикувано от: Nikolavp в Aug 15, 2007, 02:12 Не че много разбирам от програмиране, но какъв е начина да "вкара" променлива от тип char bla[] или char *bla, ако не е задал "дължината" на низа. Аз бих го направил също със string и ще бъде нещо подобно
Титла: Сравняване на низове в С++ Публикувано от: dvasilev в Aug 15, 2007, 09:31 //offtopic
@the_real_maniac: Като гледам още малко ще дадеш съвет на човека да се фокусира на C и да зареже ООП за да не духа супата ;-) Титла: Сравняване на низове в С++ Публикувано от: paucku в Aug 15, 2007, 10:32 string е клас а word и word1 са обекти. Така че не е ясно точно какво сравняваш със следния израз:
За да сравняваш стрингове от клас string, трябва да ползваш методите на този клас а не ">" или "<", защото най-вероятно тези оператори не са предефинирани за стрингови обекти. Титла: Сравняване на низове в С++ Публикувано от: gat3way в Aug 15, 2007, 10:41
Ъм, тоест? Титла: Сравняване на низове в С++ Публикувано от: Nikolavp в Aug 15, 2007, 10:43
Тоест прост cin >> Титла: Сравняване на низове в С++ Публикувано от: the_real_maniac в Aug 15, 2007, 10:44
offtopic: Ти пък ... ![]() ![]() Титла: Сравняване на низове в С++ Публикувано от: gat3way в Aug 15, 2007, 11:03 Не си падам много по С++, а тези streamed I/O глупости ми се виждат изключително недодялани. printf/scanf какво толкова не ви харесва?
И все пак, за каква дължина на низа става въпрос? Титла: Сравняване на низове в С++ Публикувано от: Nikolavp в Aug 15, 2007, 11:09 Ако зададеш дължината на низа, при инициализирането, след това можеш да и променяш стойността с cin >> . Така неща от рода на:
Титла: Сравняване на низове в С++ Публикувано от: gat3way в Aug 15, 2007, 11:12 Дължината, в смисъл?
Ако въведеш 25 символа например, програмата няма да изгърми? Титла: Сравняване на низове в С++ Публикувано от: Nikolavp в Aug 15, 2007, 11:25
До колкото знам, изобщо не е хубаво да си играеш с обекти, които са с индекс по - голям от този, който си задал на масива. Даже програмата излиза неправомерно.
Титла: Сравняване на низове в С++ Публикувано от: 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 и изрично му указвай колко байта да чете. В твоят пример четенето ще стане така:
Друг е въпроса че това вече не прилича кой-знае колко на програма на C++. Титла: Сравняване на низове в С++ Публикувано от: gat3way в Aug 15, 2007, 15:49 Мммм има по-забавен начин да не се тормозиш за дължината на това, което се въвежда. Ето така:
По този начин, scanf() заделя автоматично памет в зависимост от дължината на въведеният низ. Единствената грижа е после тази памет да се освободи c free(). Титла: Сравняване на низове в С++ Публикувано от: Nikolavp в Aug 15, 2007, 18:40
Всъщност точно затова говорехме и аз го намекнах/показах в ползва на класа стринг, защото the_real_maniac предложи на пича да ползва низове, вместо класа в C++. Със scanf не съм много запознат, защото не съм се занимавал с чисто С. |