David J. Malan So dit blyk dat kopiëring van 'n string is nie naastenby so eenvoudig soos die kopiëring van 'n primitiewe, soos 'n int of 'n float. Na al, onder die enjinkap 'n string is 'n reeks karakters. So kopiëring van 'n string, dus moet behels die kopiëring van die hele reeks karakters. Kom ons draai ons aandag terug na daardie laaste implementering en rip uit hierdie lyn, string t gelyk is, wat Dit was duidelik dat nie voldoende nie. Kom ons vervang dit met 'n lyn wat lyk, in plaas daarvan, soos hierdie. String t kry malloc tou lengte van s plus 1 keer die grootte van 'n kar. Nou is daar 'n aanhaling 'n bietjie gaan in hierdie lyn van kode. Eerstens, malloc, kort vir geheue toekenning, en die funksie nie net dat. Gegewe 'n heelgetal, dit gee aan julle die adres van 'n stuk van die geheue van dat baie grepe. Intussen het die string lengte van s plus 1 bedoel om aan te dui dat ons as baie grepe as s reeds ', insluitend sy null Terminator, die backslash 0 aan die einde van 'n string. Intussen het ek nie noodwendig onthou hoe groot 'n kar is nie, selfs al op die meeste stelsels is dit net 1 byte, so ek sal die grootte van die kar roep uit te vind hoe groot dinamiese 'n individuele karakter is. Sodra hulle met mekaar vermenigvuldig, kry ek weer die totale aantal grepe wat ek nodig het. Maar wat as malloc versuim om te terugkeer om die geheue wat ons nodig het? Ek wil die beste te kyk vir wat soos volg. As t gelyk aan nul, dan is ek eerste gaan gratis s, die geheue terug te kry deur string, en dan gaan ek terug 1, fout aan te dui. Maar as alles goed gaan, ek gaan om voort te gaan 'n vier lus om te gebruik en Itereer soos volg. Vir int i kry 0, n gelyke die string lengte van s. Ek gaan om dit te so lank as wat ek is nie minder as of gelyk aan n so dat ek Itereer op deur en met die nul eindig karakter in s. En op elke iterasie, ek is gaan ek te inkrementeer. Intussen, binnekant van die loop, kopieer s se i-de karakter in t se i-de plek, is dit voldoende t te doen bracket ek kry s bracket i. Ek wil die beste voeg een addisionele lyn my kode. In die besonder, omdat ek nou met behulp van malloc, vra vir die geheue, is dit my verantwoordelikheid om vry te maak dat die geheue wanneer ek klaar is met dit, wil ons net moet bevry word geheue wat wat aan ons gegee deur get string. So aan die einde van hierdie program, ek is gaan een addisionele lyn te voeg t te bevry voordat hy terugkeer 0 sukses aan te dui. Kom ons nou ook red, saamstel, en hardloop hierdie nuwe program. Maak afskrif 1 dot streep kopie 1. En ek sal iets sê soos hallo in alle klein. En gelukkig, hierdie keer my oorspronklike bly onveranderd. hallo in alle klein. Maar die kopie is, inderdaad, gekapitaliseer.