1 00:00:00,000 --> 00:00:00,410 2 00:00:00,410 --> 00:00:03,130 >> David J. MALAN: Deci, se dovedește că copierea unui șir nu este aproape la fel de 3 00:00:03,130 --> 00:00:05,750 simplu ca copierea unui primitiv, ca un întreg sau un float. 4 00:00:05,750 --> 00:00:09,190 La urma urmei, sub capota un șir este o secvență de caractere. 5 00:00:09,190 --> 00:00:13,130 Deci, copierea un șir de caractere, prin urmare, trebuie să implica copierea că întreaga secvență a 6 00:00:13,130 --> 00:00:14,240 caractere. 7 00:00:14,240 --> 00:00:17,470 >> Să ne îndreptăm atenția înapoi la care ultima punere în aplicare și rupe această 8 00:00:17,470 --> 00:00:21,470 linie, șir t este egal cu s, ceea ce în mod clar nu a fost suficientă. 9 00:00:21,470 --> 00:00:24,440 Să-l înlocuiască cu o linie care arată, în schimb, ca aceasta. 10 00:00:24,440 --> 00:00:34,020 Șir t devine malloc de lungime șir de S Plus 1 ori mai mare de un char. 11 00:00:34,020 --> 00:00:36,320 >> Acum există citat un pic merge în această linie de cod. 12 00:00:36,320 --> 00:00:39,330 În primul rând, malloc, pe termen scurt de memorie alocare, și 13 00:00:39,330 --> 00:00:40,700 Funcția nu doar asta. 14 00:00:40,700 --> 00:00:44,740 Având în vedere un întreg, se întoarce la tine adresa de o bucată de memorie de 15 00:00:44,740 --> 00:00:45,960 că mulți bytes. 16 00:00:45,960 --> 00:00:50,090 Între timp, lungimea șirului de s, plus o este menit să indice că vrem ca 17 00:00:50,090 --> 00:00:54,690 de multe bytes ca s ocupă deja, inclusiv secvența sa terminală nul, 18 00:00:54,690 --> 00:00:57,050 backslash 0 la sfârșitul unui șir. 19 00:00:57,050 --> 00:01:00,170 >> Între timp, nu-mi amintesc în mod necesar cât de mare este un char, chiar 20 00:01:00,170 --> 00:01:04,340 deși pe majoritatea sistemelor este pur și simplu o octet, așa că voi suna dimensiune de caracter la 21 00:01:04,340 --> 00:01:08,210 dau seama dinamic cât de mare un caracter individual este. 22 00:01:08,210 --> 00:01:12,550 După ce înmulțit împreună, mă întorc numărul total de bytes de care am nevoie. 23 00:01:12,550 --> 00:01:14,680 >> Dar ce se întâmplă dacă malloc nu reveni memoria avem nevoie? 24 00:01:14,680 --> 00:01:16,730 Mi-ar verifica cel mai bine pentru că, după cum urmează. 25 00:01:16,730 --> 00:01:23,330 Dacă t este egal cu zero, atunci mă duc întâi pentru gratuit, memoria întors de get 26 00:01:23,330 --> 00:01:27,120 șir, și apoi am de gând să întoarcă 1, pentru a semnifica eroare. 27 00:01:27,120 --> 00:01:30,360 >> Dar dacă totul este bine, am de gând să procedeze de a utiliza un patru buclă și repeta 28 00:01:30,360 --> 00:01:31,110 după cum urmează. 29 00:01:31,110 --> 00:01:36,000 Pentru int i obține 0, n este egal cu lungimea șir de s. 30 00:01:36,000 --> 00:01:40,350 Am de gând să facă acest lucru, atât timp cât i se mai mic sau egal cu n, astfel încât să 31 00:01:40,350 --> 00:01:44,460 repeta în sus prin și inclusiv caracter de terminare nul în s.. 32 00:01:44,460 --> 00:01:47,450 >> Și pe fiecare iterație, eu sunt O să i incrementa. 33 00:01:47,450 --> 00:01:52,496 Între timp, în interiorul de această buclă, copiați s lui i-lea caracter în t lui i-lea 34 00:01:52,496 --> 00:01:59,310 locație, este suficient să se facă t suport i se s suport i. 41 00:01:59,320 --> 00:02:02,750 >> Să acum salva, compila, și rula acest nou program. 42 00:02:02,750 --> 00:02:06,690 Face copie 1 punct slash copie 1. 43 00:02:06,690 --> 00:02:09,460 Și voi spune ceva de genul salut în toate litere mici. 44 00:02:09,460 --> 00:02:12,280 Și din fericire, de data aceasta mea original rămâne neschimbată. 45 00:02:12,280 --> 00:02:13,660 salut în toate litere mici. 46 00:02:13,660 --> 00:02:15,540 Dar copia este, într-adevăr, capitalizate. 47 00:02:37,120 --> 00:02:38,963