Loading...
melda.h avatar melda.h 4 Точки

Pointers

Имам две функции и двете намират дължина на символен низ т.е. правят едно и също. Не мога да разбера какво точно прави while и в двете фукции и по какво се различават.

unsigned int strlen1(const char* str){
int i = -1;

while(str[++i]);

return (unsigned int) i;

}

unsigned int strlen2(const char* str){
const char* s = str;

while(*str++);

return (unsigned int) (str - s - 1);

}

 

Тагове:
0
C++ Programming
ThePSXHive avatar ThePSXHive 436 Точки
Best Answer

В първата функция (strlen1) се използва индексиране чрез променливата i докато броят на символите в низа бива преброен, докато във втората функция (strlen2) се използва т. нар. адресна аритметика (pointer arithmetics) непосредствено чрез указателят s. Понеже и в двата случая формалният аргумент e C-style низ (сиреч, не е обект от клас std::string), итерацията трябва да продължи до срещането на нулевият символ ('\0'), обозначаващ края на съответния низ.

 

0
melda.h avatar melda.h 4 Точки

Благодаря ти! :)

1
Dimitar_Petkov_Petkov avatar Dimitar_Petkov_Petkov 169 Точки

Използването на :

int i = -1;

while(str[++i]);

е вярно, но според мен прави кодът по трудно "четим". По - удачния (за мен - IMHO) вариант е да инкреметираш i в самия цикъл.  Ако все пак искаш да спестиш един ред,  unsigned i = 0  и тогава прави while(str[i++]).

0
09/03/2017 17:05:49
melda.h avatar melda.h 4 Точки

Благодаря!

0
melda.h avatar melda.h 4 Точки

return (unsigned int) (str - s - 1);
А това какво прави, че не ми е много ясно? Като цяло указателите не са ми много ясни.. май
Защо трябва да имаме друг указател  s и *str++ като е със * работи със стойността или адреса?

0
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки

str - s в този случай вади от pointer позицията до която си стигнала pointer-а на началото на стринга. Идеята е, че като стигнеш до null terminator-а, ако извадиш от тази позиция началото, ще получиш дължилата (примерно за {'a', 'b', 'c', '\0'}, ако pointer-а към началото, което е 'a', има стойност 315, тогава поинтер-a към '\0' ще има стойност 318 и съответно 318 - 315 = 3, което е дължината на стринга). Нещо подобно на това споменахме в лекцията, когато говорихме за C-Strings (слайд 35 в тази презентация: https://softuni.bg/trainings/resources/officedocument/13191/presentation-cpp-programming-february-2017)

Допълнителното -1 идва заради начина, по който е написан while-а. Вътре в условието е *str++, което първо ще направи *str и след това ще направи str++. Това е защото a = b++ първо ще сложи a = b, след това ще направи b++ (a = ++b пък първо ще увеличи b, след това ще го сложи на a). Тоест когато стигнеш '\0'-та ще има още едно ++, което ще те прати след нея (в примера с abc, ще стигнем до 318, ще го оценим, че там пише '\0', обаче понеже ++-а се извършва след всичко - ще стигнем на 319 преди да излезем от цикъла).

Btw, най-лесния начин да ги разбереш тези неща е като ги пуснеш тези функции и на всяка стъпка си печаташ на конзолата коя променлива какво пише в нея. Така хем ще си пробвала, хем ще запомниш по-добре - когато нещо ти мине през ръцете се помни много по-добре, отколкото когато само ти отговорят :)

0
melda.h avatar melda.h 4 Точки

Благодаря ти много! Да, определено това най - много би ми помогнало!

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.