Witam i witam ponownie. W tym wykładzie chcę zacząć mówić o funkcjach napisów.
Wspomniałem wcześniej, że
łańcuchy, tablice znaków nie są
zmiennym typem danych w c.
Możesz więc użyć dowolnego z operatorów, ale
nadal będziesz musiał być w stanie zrobić wiele rzeczy na łańcuchach.
Będziesz mógł nimi manipulować.
Będziesz chciał uzyskać długość. Chcesz je
porównać, prawdopodobnie przekształcą je różne rzeczy.
Na szczęście standardowa biblioteka zawiera wiele funkcji, których można
użyć do wykonywania tego typu operacji.
Najpierw zacznę mówić o niektórych z najczęściej spotykanych, a
potem przejdziemy do bardziej szczegółowych na innych wykładach.
Więc już wiemy, że
ciąg znaków jest tablicą znaków zakończoną znakiem null.
Ciągi znaków są powszechnie używane w programach języka C.
C na szczęście udostępnia wiele funkcji zaprojektowanych specjalnie do pracy z łańcuchami.
Te, które zamierzamy omówić, są najczęściej używane.
Po pierwsze, uzyskanie długości łańcucha za pomocą funkcji str length.
Kopiowanie jednego ciągu znaków do drugiego.
Pamiętaj, powiedziałem ci wcześniej, że nie możesz użyć operatora przypisania do przypisania łańcucha.
Więc co robisz, to używasz str copy lub strn copy.
Ponadto łączenie dwóch ciągów znaków razem, konkatenacja.
Jest kot strn i kot strn.
I określenie, czy dwa ciągi znaków są równe.
Ponownie, operator równa się równa się nie będzie działał do porównywania łańcuchów,
ponieważ są one tablicami.
Więc jeśli chcesz porównać łańcuchy, musisz użyć specjalnych funkcji
dostarczonych przez bibliotekę c. Str porównać i strn porównać.
Najpierw porozmawiajmy o długości.
Wszystkie te funkcje są zdefiniowane w ciągu. nagłówka, więc musisz to
uwzględnić podczas wywoływania lub wywoływania jednej z tych funkcji.
Uzyskanie długości sznurka.
Długość ciągu to funkcja, która znajduje długość łańcucha, jest całkiem prosta.
Jest zwracana jako zmienna rozmiaru t.
Możesz używać zmiennej size t zamiennie z int.
Ale najpierw musisz dołączyć ten plik nagłówkowy, jeśli chcesz użyć długości ciągu
i tak go używasz.
Zasadniczo tworzysz literał ciągu w podwójnych cudzysłowach i przypisujesz go do tablicy znaków.
Nie określasz rozmiaru tablicy znaków.
Kompilator zrobi to za Ciebie i doda terminator zerowy.
Gdy już zdefiniujesz mój łańcuch za pomocą
stałej łańcuchowej, możesz wywołać długość ciągu i po prostu przekazać ten
znak, całkiem nieźle.
Jest to jeden z najczęściej używanych, ponieważ często chcesz uzyskać taką długość łańcucha
podczas sprawdzania poprawności lub cokolwiek innego, jeśli chcesz
się upewnić, że nie ma przepełnienia bufora, możesz to również zrobić.
Ta funkcja zmienia ciąg.
Więc nagłówek funkcji nie używa stałej w
deklarowaniu formalnego ciągu parametrów.
Gdybyś miał iść i spojrzeć na sznurek. h
wewnątrz user include w twoim katalogu, zobaczysz, że
nie jest zdefiniowana jako stała.
Kopiowanie ciągów. Kopiowanie ciągów to
modyfikacja istniejącego ciągu, modyfikacja istniejącej
tablicy znaków, która zawiera pewne dane.
A jeśli nic w nim nie ma, chcesz coś tam włożyć.
Ponieważ nie możesz przypisać podbicia w c, nie możesz również przypisać łańcuchów. Wspomniałem o tym wcześniej,
deklarowanie znaku, a następnie użycie operatora przypisania równości nie działa.
Więc to, co musisz zrobić, to użyć funkcji kopiowania
str do skopiowania ciągu do istniejącego.
Jest odpowiednikiem operatora dla łańcuchów, operatora przypisania.
Jeśli zadeklarujemy dwie tablice znaków źródło i miejsce docelowe, wszystko,
co musimy zrobić, to powiedzieć str, kopiuj źródło, a następnie niezależnie od
tego, jakie jest źródło, możemy umieścić w ciągu i to
samo z miejscem docelowym.
Możesz tam również umieścić zmienne, jeśli chcesz je skopiować.
Ale to, co tutaj robimy, to pierwszy parametr to miejsce, do którego kopiujesz.
Drugi parametr to ciąg, który kopiujesz.
Więc source miałoby to jest source wewnątrz niego po str copy.
Destination lub dest będzie mieć to miejsce wewnątrz siebie
po wywołaniu str copy.
Funkcja kopiowania str nie sprawdza, czy łańcuch źródłowy rzeczywiście pasuje do ciągu docelowego.
Więc co by się stało, gdybyś miał duży sznurek.
Więc w tym poprzednim przykładzie, co by się stało, gdyby miejsce docelowe miało 100 znaków.
I zamiast mieć to jako miejsce docelowe, miał 100 znaków.
Próbowałeś skopiować go do źródła, które
miało tylko 50 znaków. Byłby problem.
Ciąg docelowy byłby większy niż ciąg źródłowy, który kopiujesz.
Więc gdybyśmy spróbowali skopiować str copy do źródła zamiast kopiować to, ponieważ źródło, które umieściliśmy w
tym, jest pobierane pięć razy lub dziesięć razy cokolwiek to jest i jedno powyżej
50, wystąpiłby błąd.
I pokażę to.
Dlatego bezpieczniejszym sposobem kopiowania łańcuchów jest użycie kopiowania strn. Zauważysz, że n można zamienić
na kopię strn.
Kopia Strn przyjmuje trzeci argument.
Maksymalna liczba znaków do skopiowania.
Więc tutaj faktycznie określasz, ile chcesz skopiować.
Więc jeśli masz źródło 40 i miejsce docelowe o 12 rozmiarach, możesz najpierw
wykonać zestaw m, który po prostu ustawia rozmiar danych w miejscu docelowym na terminatory
zerowe, w ten sposób, kiedy coś dodasz, będzie tam automatycznie, don o to się nie martwię.
Kopia str skopiuje cześć, jak sobie radzisz ze źródłem i nie będzie
sprawdzać, czy jak się masz, jest większy niż źródło.
Ale jeśli zrobisz kopię strn i skopiujesz w
miejscu docelowym, skopiuje źródło i skopiuje tylko pierwsze 10 znaków.
Tak więc ten trzeci argument powinien odpowiadać rozmiarowi miejsca docelowego.
Przejdźmy więc do bloków kodu i spójrzmy na długość łańcucha i spójrzmy na kopiowanie ciągów, aby
zobaczyć dokładnie, jak one działają.
Więc tutaj mamy nasz główny plik.
A uzyskanie sznurka o długości łańcucha jest naprawdę łatwe.
Stworzymy naszą tablicę znaków. Wiemy, jak stworzyć obszar postaci. Nie chcemy określać rozmiaru,
ale najpierw musimy umieścić nazwę, a następnie nawiasy.
A potem możemy zainicjować go czymkolwiek zechcemy,
powiedzmy wewnątrz podwójnych cudzysłowów. Podwójne cudzysłowy reprezentują literały łańcuchowe.
Więc mogę po prostu powiedzieć, że nazywam się Jason.
Końcowym wynikiem tego jest s
będzie tablicą o rozmiarze
17 znaków.
Wszystkie te znaki plus terminator zerowy.
Terminatorem zerowym jest odwrotny ukośnik zero.
Nie musisz tego umieszczać, ponieważ jest automatycznie dodawany przez kompilator.
W ten sposób możemy zainicjować i utworzyć łańcuch w tablicy znaków.
Następnie, aby go wydrukować, wystarczy powiedzieć printf i powiedzieć, że długość to.
Następnie umieszczamy procent s
jako specyfikator formatu, aby wyświetlić ciąg.
A potem wszystko, co robimy, to wypowiadanie nazwy struny.
Aby się nie pomylić, powiedzmy tylko mój ciąg.
I nie musimy używać znaku ampers i tak jak to robiliśmy wcześniej, w poprzednich przykładach,
możemy po prostu powiedzieć mój ciąg. Jeśli kompilujemy i uruchamiamy to,
być może będziemy musieli upewnić się, że dołączamy nagłówek ciągu.
Kiedy kompilujemy i uruchamiamy to, zobaczysz długość ciągu.
Więc długość wynosi, a ja nie wywołałem funkcji długości łańcucha.
Musisz więc wywołać tę funkcję, jeśli chcesz wyświetlić długość, więc po
prostu zrób coś takiego. Umieszczasz sznurek wewnątrz długości str.
Teraz, kiedy go uruchomisz, zobaczysz długość ciągu.
To nie musi być ciąg, ale rzeczywisty.
Więc tak bym wyświetlał ciąg. Jeśli chcę wyświetlić długość
ciągu, wykonuję procent d w wywołaniu funkcji.
Teraz, kiedy go
uruchomię, zauważysz, że w rzeczywistości wypisuje 16, czyli długość.
Więc jest to dość łatwa funkcja, aby użyć długości str. Jeśli chcesz skopiować
ciągi, użyj porównania str.
I chcesz użyć porównania strn, aby faktycznie określić bajty.
Więc tutaj, jeśli mamy na imię
Jason, a potem tworzymy kolejny
ciąg, właściwie to zachowamy. Nie będziemy
nawet musieli określać, a zamierzamy
powiedzieć, że utworzymy kolejny ciąg o
nazwie temp, który będzie równy str
i porównaj, przekażemy to, co chcemy kopiuj do.
Po prostu utwórz pustą tablicę znaków, a my
nadamy jej rozmiar 50.
I to, co tutaj zrobimy, to powiemy strn copy.
Pierwszym parametrem jest miejsce, w którym chcemy skopiować, powiemy temp.
Drugi parametr to to, co chcemy skopiować, czyli mój ciąg.
A potem nie chcemy przekazywać więcej niż 50 bajtów.
Możemy więc powiedzieć rozmiar temp, aby powiedzieć, że nie
chcemy przekazać więcej niż 50 bajtów. I prawdopodobnie chcesz zrobić -1
dla terminatora zerowego.
W ten sposób ten trzeci parametr jest naprawdę ważny, ponieważ nigdy nie będziemy mieć przepełnienia bufora.
Powinieneś zawsze używać strn copy, a nie str copy.
A potem możemy po prostu wyświetlić nasz ciąg, aby zobaczyć, czy został skopiowany.
Moglibyśmy powiedzieć temp, zmień to na procenty.
A kiedy to zbudujemy,
powinniśmy zobaczyć, a nie długość, powinniśmy zobaczyć, że łańcuch jest
mniej więcej taki i zakończyć go średnikiem.
Teraz powinniśmy skompilować, co robimy.
Więc teraz to uruchomimy. Powinniśmy po prostu zobaczyć nasz ciąg, który został skopiowany.
Widzimy więc, że nazywam się Jason i to
jest przechowywane w temp., Ponieważ wydrukowaliśmy temp.
Ale zawsze używaj kopiowania strn. Nie używaj str copy,
to upewni się, że nie masz przepełnienia bufora.
Trzeci parametr powinien zawsze być
miejscem docelowym, a nie
źródłem, celem. Nie ma sensu mówić, że skopiuj cały ciąg.
Ponieważ jeśli to jest mniejsze, będziesz mieć problemy. Dlatego zawsze podawaj rozmiar tego.
Widzisz, że możesz użyć operatora
sizeof, aby zobaczyć, ile bajtów znajduje się w znaku.
Porozmawiajmy o kilku innych funkcjach.
Więc wiemy, jak uzyskać długość, wiemy, jak kopiować ciągi, a co z łączeniem ciągów.
Funkcja str cap przyjmuje dwa argumenty, dwa łańcuchy
jako argumenty i kopiuje drugi łańcuch na koniec pierwszego.
Druga struna nie jest
zmieniana, tylko pierwsza. Zwróci wartość pierwszego argumentu.
Adres pierwszego znaku ciągu, do którego dołączany jest drugi ciąg.
Więc zwróć coś, mówiąc ci, gdzie faktycznie to dołączyłeś, jeśli kiedykolwiek będziesz musiał tego użyć.
Oto przykład, tworzymy ciąg znaków mojego ciągu i po
prostu zawiera on mój ciąg z terminatorem zerowym.
Tworzymy ciąg znaków wejściowych, który wynosi 80, jest pusty.
Mówimy, że wprowadź ciąg do konkatenacji. Przeczytaliśmy to.
A potem to konkatenujemy.
Drukujemy oryginalny ciąg, po którym następuje połączony ciąg, a następnie dane wejściowe.
Więc po tym, cokolwiek wprowadzisz, zostanie umieszczone
na końcu mojego ciągu. Więc jeśli wpiszesz Jason, będzie to mój ciąg spacji Jason.
Taki byłby mój ciąg.
Ponieważ robisz na nim strusia.
Najpierw drukujemy ciąg, a następnie nazywamy go str cat.
Dane wejściowe będą w rzeczywistości równe temu, co zostało wprowadzone, po moim
ciągu, po którym następuje to, co zostało wprowadzone.
Za chwilę przejdziemy do tego przykładu. Teraz, podobnie jak str
copy, str cat ma również strn end cat.
Tak więc połączona wersja staje się nowym pierwszym ciągiem.
Więc tak jak konkatenacja stringów z kotem str,
istnieje kot strn.
Str cat ma ten sam problem z kopiowaniem str. Może wystąpić przepełnienie bufora. W rzeczywistości nie
gwarantuje, że drugi ciąg będzie pasował do pierwszej tablicy.
Więc jeśli nie masz wystarczającej ilości miejsca w pierwszej tablicy, możesz napotkać problemy z przepełnieniem buforu.
Więc co chcesz użyć kota strn.
Drugi argument wskazuje maksymalną liczbę znaków do dodania.
Na przykład, jeśli zrobisz strn cat i
dwa stringi powodują błąd w dodatku, doda on tylko pierwsze 13 znaków dodatku do błędów, w zależności od
tego, co nastąpi wcześniej. Jeśli dodatek jest mniejszy
niż 13, będzie dodawany tylko do momentu wyświetlenia terminatora zerowego.
W tym przykładzie tworzymy dwa ciągi.
To jest źródło tego celu. Robimy kota strnowego.
Na końcu kopiujemy tylko 15 znaków
do miejsca docelowego. Więc bez względu na rozmiar miejsca docelowego, będzie
to rozmiar miejsca docelowego plus 15, a następnie wydrukujemy go.
Spójrzmy więc ponownie na bloki kodu.
Oto nasz przykład i utworzymy dwie tablice ciągów znaków, jedną
o rozmiarze 50, a drugą o rozmiarze 50.
Zrobimy dwie kopie str, aby ustawić je na dane.
To jest miejsce docelowe źródła. A następnie w linii 12 wykonujemy strn cat.
A przeznaczeniem będzie to, z czym się łączymy.
Więc źródłem będzie to, co zamierzamy połączyć.
I zamierzamy przypisać tylko 15 znaków.
Więc jeśli źródło było większe niż 15,
nie skopiowalibyśmy ich wszystkich.
Więc kiedy to zbudujemy
i uruchomimy, zobaczysz, że teraz mówi,
że to jest plik źródłowy lub że to jest miejsce
docelowe, a następnie to jest źródło.
Więc mówi, że to jest cel, to jest źródło.
Połączył to z końcem przeznaczenia.
Dlatego zawsze chcesz używać strn cat do konkatenacji, aby uniknąć przepełnienia bufora.
Porozmawiajmy o str compare, które powtarzam przypadkowo zamiast
str copy, str compare.
Aby porównać ciągi znaków, musimy również użyć funkcji.
Jeśli chcesz porównać jeden ciąg z innym,
nie możesz użyć podwójnych równości, które sprawdzają tylko odwołania,
czy masz ten sam adres. Więc to, czego potrzebujesz, to porównać str.
Spowoduje to porównanie zawartości ciągu.
Nie porównuje tablicy. Dzięki temu może być używany
do porównywania ciągów przechowywanych w tablicach o różnych rozmiarach.
Nie porównuje znaków.
Możesz używać argumentów, takich jak jabłka i a, w podwójnych cudzysłowach, ale
nie możesz używać argumentów znakowych, takich jak pojedynczy znak a.
Ta funkcja robi dla łańcuchów to samo, co operatory relacyjne dla liczb.
Zatem funkcja porównująca zwróci
wartość, która mówi ci, czy ciąg jest równy, czy
jest większy, czy mniejszy niż.
Jeśli jest równa, zwróci zero.
Jeśli jest mniejsze niż, zwróci mniej niż zero, jeśli słowo jeden
jest mniejsze niż słowo dwa.
A jeśli słowo dwa jest mniejsze niż słowo jeden, zwróci więcej niż zero.
A więc co to dokładnie oznacza? Pozwólcie, że podam
wam przykład, jak to działa.
Umieśćmy to w blokach kodu i uruchommy.
Ale tutaj robimy kilka porównań str i powiemy ci, jakie są wartości, czy są mniejsze lub
większe niż, ponieważ nie jest to zbyt jasne.
Więc weźmy to i spójrzmy na to w blokach kodu.
Oto nasz przykład. Porównujemy zbiór ciągów, a następnie po prostu wyświetlamy
wyniki porównania str, niezależnie od
tego, czy jest to zero, czy cokolwiek innego.
Więc jeśli porównasz dwa ciągi a i a, muszą one być w podwójnych cudzysłowach.
A to, co tutaj widzisz, to drukowanie tego, co nazywamy.
Więc
ograniczamy cudzysłowy. Wstawiamy ukośnik odwrotny, aby faktycznie wypisać znak
cudzysłowu i nie kończył łańcucha. Ale jeśli porównamy a i
a, to powinno zwrócić zero. Ponieważ zero oznacza, że łańcuchy są równe.
Jeśli porównamy a i b, porównanie str powinno zwrócić mniej
niż.
Ponieważ a jest mniejsze niż b.
B a powinno zwrócić wartość większą od zera.
Ale przejdźmy przez to, upewnijmy się, że nie popełnię żadnych
błędów i faktycznie zobaczymy to na wyjściu.
Więc kiedy to
uruchomimy, pomoże ci to zapamiętać, jakie liczby zostaną zwrócone.
Więc kiedy porównujesz a i a, w rzeczywistości otrzymujesz 0.
Jeśli porównasz a i b, b jest mniejsze
niż a, więc jest to wartość ujemna, coś mniejszego
niż zero, mógłbym powiedzieć coś przeciwnego,
nawet ja wciąż ich zdezorientowałem. Ponieważ a jest większe niż b, a
jest większe niż b, ujemne.
B jest mniejsze niż a, więc otrzymujesz coś większego niż zero, czyli jedynkę.
C jest większe niż a, więc otrzymujesz jeden, tylko wtedy, gdy
b było większe niż a.
A potem porównujesz wielkie i małe litery.
Kiedy porównujesz wielkie i małe litery, robi to odwrotnie. Z jest właściwie mniejsze
niż małe a.
Tak więc wielkość litery jest zawsze mniejsza niż mała.
Jeśli spróbujesz porównać jabłka i jabłko, to będzie 1, ponieważ jabłko
jest mniejsze niż jabłka.
I tak właśnie działają porównania. Ważne jest, aby zrozumieć, że 0 jest większe niż
1 lub mniejsze niż 1. Ponownie, mniej niż
zero powie, że pierwsza struna jest mniejsza niż
druga.
A wartość większa od zera oznacza, że pierwsza struna jest większa od drugiej.
Ta funkcja jest bardzo łatwa w użyciu. Nie musisz się martwić
o żadne porównanie strn, ponieważ nie ma to znaczenia rozmiar
porównywanych tablic.
Funkcja porównująca str porównuje ciągi do momentu znalezienia odpowiednich znaków, które się różnią.
Więc może to trwać aż do końca jednego ze strun.
Funkcja porównywania strn porównuje ciągi do momentu, gdy się różnią lub
do porównania liczby znaków określonej przez trzeci argument.
Więc w tym przypadku nie musisz używać porównania
strn do przepełnienia bufora. Istnieje, ale użyjesz go tylko
wtedy, gdy chcesz porównać tylko określoną liczbę znaków.
Jest używany inaczej
niż str copy, strn copy lub strn cat.
Porównanie strn mówi tylko, że chcę wyświetlić tylko tyle znaków.
Byłoby więc przydatne, jeśli szukasz tylko przedrostka.
Więc jeśli chcesz wyszukać ciągi zaczynające się od astro,
możesz ograniczyć wyszukiwanie do pierwszych pięciu znaków i
użyć porównania strn w ten sposób.
Więc w tym przykładzie widzisz, że mówimy, że równa się zero.
Często widzisz taką instrukcję if, gdy używasz str compare.
Widzisz porównywanie str w tej instrukcji i równe zero, aby powiedzieć, że jest równe.
Więc strn compare używa pierwszych pięciu znaków,
porównuje astro z pierwszymi pięcioma postaciami astronomii.
Powie, że to znalazł. To będzie równe zero i będzie mówione, że odkryto astronomię.
Jeśli zrobisz to samo, ale porównując go z innym ciągiem zwanym
zdumiewającym, nie znajdzie go, w rzeczywistości się wyświetli - powie,
że zdumiewające jest większe niż astro. Więc wyświetli coś większego niż
0, czyli 1 i nie będzie
wyświetlać żadnych danych.
Więc użyj str compare, kiedy porównujesz ciągi znaków dla całej zawartości.
Użyj porównania strn, jeśli chcesz porównać tylko przedrostek z ciągiem.
Ten sam typ składni lub ciąg znaków porównuje tylko ten trzeci argument.
Więc rozmawialiśmy dużo o kilku naprawdę
ważnych funkcjach, których będziemy używać, głównie o
długości strn, kopiowaniu strn, strn cat i porównaniu strn.
Będziemy mieli wyzwanie, w którym będziesz musiał wykorzystać te funkcje, które pozwolą ci się
z nim zapoznać.
Ale naprawdę się z tym zaznajomisz, ponieważ
będziesz ich używać w kółko. Dziękuję Ci.