c++ sors pitanka

35 отговора 993 прегледа
#1

c++ sors pitanka

/*Niakoi moje li da mi kaje zashto tazi funckia za slepvane na stringove ne vurshi rabota t.e. zlepva samo 5-6 znaka*/
char* cat(const char* first, const char* second)
{
int szFirst = GetSize(first);
int szSecond = GetSize(second);

char* res = new char[szFirst + szSecond];

unsigned int k = 0;
while(k <= szFirst)
res[k] = first[k++];
while((k - szFirst) <= szSecond)
res[k] = second[(k++) - szFirst];

return res;
}

Отговор
в отговор на Zadachka #2

Re: c++ sors pitanka

zaradi tova
res[k] = second[(k++) - szFirst];

Отговор
в отговор на Zadachka #3

Re: c++ sors pitanka

а защо не си привел и сорса на GetSize ?
според мене имаш грешка във циклите - така ще прехвърлиш и финалните нули, защото въртиш цикъла до равенство. а защо използваш while? for не ти ли харесва? но няма значение - имаш грешка от отместване с едно. чудя се как въобще нещо се слепва - би трябвало да върне само първия стринг. предполагам се дължи на грешка в GetSize.
освен това аз не бих ползвал res[k]=first[k++] защото не съм сигурен дали на всеки компилатор к ще се увеличи след присвояването, а не след десния израз. но може да е в стандарта, така че там не споря.

Отговор
в отговор на Zadachka #4

Re: c++ sors pitanka

Osven che koda e greshen (kakto drugite podcehrtataha) wuprosa e GetSize() wrushta dulzhinata na stringa, bez nulata ili sus? Ako e bez, togava new char[szFirst + szSecond] njama da alokira dostatuchno pamet. Shte raboti w (N-1)/N ot sluchaite, kudeto N ti e alignmenta za new. Obiknowenno Size kato termin se izpolzwa za razmer na tzjalata struktura, ili string, dokato Length za dulzhinata mu (bez 0-ta). Ako puk size ti wrushta razmera (dulzhinata + 1 - nulata) - to shte alokirash bait poveche - no tova ne e bolezneno - wse pak e greshno - tuj kato shte zabludi drug programist, ili tester gledasht koda.


az bih go prenapisal taka:


char *cat( const char *first, const char *second )
{
int len;
char *s;
len = strlen(first) + strlen(second);
s = (char *)malloc( len + 1 ); /* mjasto za 0-ta */
while( *first ) *s++ = *first++;
while( *second ) *s++ = *second++;
*s = 0;
return s;
}


To err is human
To stderr is inhuman
Отговор
в отговор на malkia #5

Re: c++ sors pitanka

a da ne govorim che mozhe i po-burzo :)


char *cat( const char *first, const char *second )
{
int flen, slen;
char *s;
flen = strlen(first);
slen = strlen(second);
s = (char *)malloc( flen + slen + 1 ); /* mjasto za 0-ta */
memcpy( s, first, flen ); s+= flen;
memcpy( s, second, slen ); s += slen;
*s = 0;
return s;
}


To err is human
To stderr is inhuman
Отговор
в отговор на malkia #6

Хм. malkia...

...на "дъртия НЕпрограмист" нещо не му харесват неща от сорта:

char *MyFunc(arg1,arg2,arg3.......)
{
char *ptr;
..............
while( ala_bala )
*ptr++=any_char;
return *ptr;
}

Не те ли притесняват нещо ПОСЛЕДНИТЕ два реда? Тук не говоря въобще дори за последен '\0' char... Някъде съм патил от подобна хватка. Виж номера
с работа с памет - няма грешка. Ама ти, за всеки случай проверяваш ли,
накъде зяпа указателя заявен с malloc, щото от много бързане...

Отговор
в отговор на malkia #7

нещо не разбирам

къф е смисъла от функция, която ще ми върне ъказател към терминиращата 0?

Отговор
в отговор на Плaмeн #8

Re: нещо не разбирам

Такава функция е полезна, когато залепваш много парченца на края на един низ. Типичен случай е например реализирането на printf. Ако нямаш strcat, който връща новата терминираща нула, алгоритъма става квадратен, щото правиш така:

char *pDest, *pSrc[10];
for(i=0; i<10; i++) {
strcat(pDest, pSrc); // -- ей това тук всеки път тръгва да търси нула от началото
}

---
Bingo! Bongo! I don't want to leave the Kongo!
Отговор
в отговор на Skotowydec #9

Re: нещо не разбирам

wsushnost da - za tova mozhe da se izpolzwa - az wsushnost takava funckia sum izpolzwal - w tekushtia mi sors se kazwa dori stradd

No si priznawam - originalnata idea ne beshe tova - seriozen bug ot moja strana!!!! CHERNA TOCHKA! (a si misleh che moga da pisha bez da kompiliram i testwam napravo! - durtooo durtoo!)

To err is human
To stderr is inhuman
Отговор
в отговор на malkia #10

Допуснал си малка грешка

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


System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Отговор
в отговор на Плaмeн #11

Re: нещо не разбирам

Kakto Skotowydetza-a kaza - mozhe da se izpolzwa za konkatenirane na stringove - obache sega kato razmislja - az alokiram sus malloc() - i wuobshte ne e jasno kakvo ima sled poslednata nula - i dali wuobshte e safe za barane tam....

taka che koda kojto sum napisal e greshen - trjabwa da wrustha nachaloto na alokiranata pamet za stringa - a ne kraja...

To err is human
To stderr is inhuman
Отговор
в отговор на Colombino #12

Re: Допуснал си малка грешка

ahum

To err is human
To stderr is inhuman
Отговор
в отговор на Zadachka #13

Komentar: c++ sors pitanka

/*
defakto taka kompilrano programta slaga simvolite samo ot First
GetSize se durji stabilno i vurshta 'size + terminirashta nula '
t.e az eksperintiram ei taka :

int main()
{
try
{
const char* a = "12345";
const char* b = "67890";
std::cout<<cat(a, b);
}
catch(...)
{
std::cerr<<"errrrrrrorrrr";
return 1;
}
return 0;
}

char* cat(const char* first, const char* second)
{
int szFirst = GetSize(first);
int szSecond = GetSize(second);

char* res = new char[szFirst + szSecond];

unsigned int k = 0;
while(k < szFirst)
res[k] = first[k++]; // bez nulata
while((k - szFirst) < szSecond)
res[k] = second[(k++) - szFirst];

return res;
}

Отговор
в отговор на Zadachka #14

Re: Komentar: c++ sors pitanka

ami ti ne useshtash li che s towa szFirst deto e rawno na razmera na
bufera zaedno s nulata, pose kopirash wsichko, wkluhcitelno i taia
nula i sled towa kopirash i second ama sled taia nula...
mi tam si e samo ne go wijdash shtoto se pechati samo do pyrwata 0
basi...

Отговор
в отговор на Zadachka #15

Re: Komentar: c++ sors pitanka

hubawo che pishesh komentari ama kompilatora ne gi chete.
wsyshnost tochno za takiwa komentari syweta mi e da ne gi pisesh
a da napishesh koda taka che towa da e ochewidno.

ako sega uchish C wzemi na serizono tozi aspect i ostawi
pisaneto na zabawni konsturkcii i optimizacii sled kato nauchish
poweche za ezika i se nauchish da debugwash :)

Отговор
в отговор на Zadachka #16

Towa 'standartno' li e?

kakto zaphod se usymni, tova neshto dali e pravilno (po C++ standart), и при условие, че ++ и [] ne sa overloadnati?

res[k] = first[k++];

Отговор
в отговор на Zadachka #17

Re: Komentar: c++ sors pitanka

char* cat(const char* first, const char* second)
{
int szFirst = GetSize(first) - 1;
int szSecond = GetSize(second);

char* res = new char[szFirst + szSecond];

unsigned int k = 0;
while(k < szFirst)
res[k] = first[k++]; // bez nulata
while((k - szFirst) < szSecond)
res[k] = second[(k++) - szFirst];

return res;
}

Отговор
в отговор на Zadachka #18

Re: Komentar: c++ sors pitanka

това че връща и нулата само влошава нещата - така няма да прехвърлиш само нея, а и първият байт след нея, който не се знае какъв ще е. обръщам ти още веднъж внимание УСЛОВИЕТО ЗА КРАЙ НА ЦИКЪЛА ТРЯБВА ДА Е ЗА ИНДЕКС ПО-МАЛЪК ОТ РАЗМЕРА, А НЕ ЗА ПО-МАЛЪК ИЛИ РАВЕН, КАКТО ТИ СИ ГО НАПИСАЛ!

Отговор
в отговор на M. Kocмaтa #19

Re: Towa 'standartno' li e?

k++ shte se izpulni na sledwashtia "red" - statement.

ne sum siguren ako e overloadnato - verojatno da

To err is human
To stderr is inhuman
Отговор
в отговор на Zadachka #20

return true;

Thanks() za mneniata; vse pak opravih koda.
Chovek se uchi ....

nai veche kogato tova koeto iskash da stane - stava

/*3. Неоткриваемите грешки са безкрайно разнообразни за разлика от откриваемите, които по определение са ограничени.
*/


Отговор