1 00:00:00,000 --> 00:00:00,410 2 00:00:00,410 --> 00:00:03,130 >> DAVID J. Malan: Tak to dopadá, že kopírování řetězec není zdaleka tak 3 00:00:03,130 --> 00:00:05,750 jednoduché jako kopírování primitivní, jako int nebo float. 4 00:00:05,750 --> 00:00:09,190 Koneckonců, pod kapotou řetězec je posloupnost znaků. 5 00:00:09,190 --> 00:00:13,130 Takže kopírování řetězec, proto musí zahrnuje kopírování, že celá sekvence 6 00:00:13,130 --> 00:00:14,240 znaky. 7 00:00:14,240 --> 00:00:17,470 >> Pojďme obrátit svou pozornost zpět k tomu poslední realizace a vytrhnout to 8 00:00:17,470 --> 00:00:21,470 linka, řetězec t rovna s, což zjevně nebylo dostatečné. 9 00:00:21,470 --> 00:00:24,440 Pojďme jej nahradit řádek, který vypadá, místo toho, jako je to. 10 00:00:24,440 --> 00:00:34,020 String t dostane malloc délky struny S plus 1 krát velikost char. 11 00:00:34,020 --> 00:00:36,320 >> Teď je tu citát trochu děje Na této řádku kódu. 12 00:00:36,320 --> 00:00:39,330 Za prvé, malloc, krátký pro paměť alokace, a 13 00:00:39,330 --> 00:00:40,700 funkce dělá jen to. 14 00:00:40,700 --> 00:00:44,740 Vzhledem k tomu, celé číslo, vrátí se vám na adresa kus paměti 15 00:00:44,740 --> 00:00:45,960 že mnoho bytů. 16 00:00:45,960 --> 00:00:50,090 Mezitím, délka řetězce s plus 1 je třeba uvést, že chceme jako 17 00:00:50,090 --> 00:00:54,690 mnoho bajtů jako s již zabírá, včetně nulového ukončovacího znaku, 18 00:00:54,690 --> 00:00:57,050 lomítko 0 na konci řetězce. 19 00:00:57,050 --> 00:01:00,170 >> Mezitím jsem se nemusí nutně pamatovat jak velký znak je, i 20 00:01:00,170 --> 00:01:04,340 i když na většině systémů je to prostě 1 byte, tak zavolám velikost char na 21 00:01:04,340 --> 00:01:08,210 zjistit, dynamicky, jak velký individuální charakter je. 22 00:01:08,210 --> 00:01:12,550 Jakmile se násobí spolu, já se vrátím celkový počet bajtů, které potřebuji. 23 00:01:12,550 --> 00:01:14,680 >> Ale co když malloc selže vrátit paměť, kterou potřebujeme? 24 00:01:14,680 --> 00:01:16,730 Já bych nejlépe zkontrolovat, že takto. 25 00:01:16,730 --> 00:01:23,330 Je-li t se rovná null, pak jsem poprvé bude na volné s, paměť vrácena get 26 00:01:23,330 --> 00:01:27,120 řetězec, a pak budu vrátí 1, znamenat chybu. 27 00:01:27,120 --> 00:01:30,360 >> Ale pokud je vše v pořádku, budu pokračovat použít čtyři smyčky a iteraci 28 00:01:30,360 --> 00:01:31,110 následujícím způsobem. 29 00:01:31,110 --> 00:01:36,000 Pro int i dostat 0, n rovná délka řetězce s. 30 00:01:36,000 --> 00:01:40,350 Budu to dělat tak dlouho, jak jsem je menší než nebo se rovná n tak, že jsem 31 00:01:40,350 --> 00:01:44,460 iteraci vzhůru a včetně null ukončovací znak v s.. 32 00:01:44,460 --> 00:01:47,450 >> A v každé iteraci, jsem bude zvyšovat i. 33 00:01:47,450 --> 00:01:52,496 Mezitím, uvnitř této smyčky, zkopírujte s je i-tý znak do T i-tého 34 00:01:52,496 --> 00:01:59,310 umístění, postačí k tomu t držák i dostane y držák i. 41 00:01:59,320 --> 00:02:02,750 >> Pojďme nyní uložit, zkompilovat, a spustit tento nový program. 42 00:02:02,750 --> 00:02:06,690 Udělat kopie 1 tečka lomítko kopii 1. 43 00:02:06,690 --> 00:02:09,460 A já řeknu něco jako: ahoj ve všech malými písmeny. 44 00:02:09,460 --> 00:02:12,280 A naštěstí, tentokrát my původní zůstává beze změny. 45 00:02:12,280 --> 00:02:13,660 ahoj ve všech malými písmeny. 46 00:02:13,660 --> 00:02:15,540 Ale kopie jsou opravdu velké. 47 00:02:37,120 --> 00:02:38,963