Deklaracje ciągów

Łańcuch znaków w języku C to jednowymiarowa tablica znaków, której ostatnim elementem jest znak końca linii - zero (łańcuch zakończony znakiem NULL, czyli łańcuch zakończony znakiem NULL).

Ogłoszenie typ zmiennej Ciąg znaków w C jest możliwy na trzy sposoby, z których dwa inicjują ciąg w czasie deklaracji.

Pierwszy sposób:

Deklaracje tablicy znaków (nie zapomnij dodać miejsca na kończący znak null):

Znaki;

Drugi sposób:

Przypisz zmiennej łańcuchowej wartość początkową (w tym przypadku kompilator może sam obliczyć długość łańcucha):

Char s = "Przykład inicjalizacji ciągu";

Na prawo od znaku przypisania znajduje się stała łańcuchowa. Zero ('\0') jest automatycznie dodawane na końcu ciągu. Stałe łańcuchowe znaków są umieszczane w statycznej klasie pamięci.

Trzeci sposób:

Niejawne wskazanie, że używana jest tablica. Po lewej stronie znaku przypisania znajduje się wskaźnik do symbolu:

Char *s="Druga opcja inicjalizacji";

Zmienna s będzie wskaźnikiem do tego miejsca w pamięć o dostępie swobodnym, gdzie znajduje się stała łańcuchowa. Ta forma notacji ma potencjalny błąd, ponieważ wskaźnik do znaku jest często określany jako ciąg. Poniższy wpis jest tylko wskaźnikiem do znaku, ponieważ nie ma miejsca na ciąg:

Znaki*;

Wprowadzanie ciągu ze standardowego urządzenia wejściowego (klawiatury)

Istnieje zestaw funkcji do pracy z ciągami. Dla wejścia ze standardowego urządzenia wejściowego (klawiatury) najczęściej wykorzystywane są funkcje biblioteczne ze standardowego modułu wejścia/wyjścia: scanf oraz dostaje.

Aby wprowadzić ciąg za pomocą funkcji scanf, używa formatu « %s» i zauważ, że znak adresu nie jest używany przed identyfikatorem wiersza « & » , ponieważ tablica jednowymiarowa jest już reprezentowana przez wskaźnik do jej początku:

scanf("%s", s);

Funkcjonować dostaje () odczytuje znaki, aż osiągnie znak nowej linii. Funkcja akceptuje wszystkie znaki do znaku nowej linii, ale nie w tym. Końcowe zero ('\0') jest dodawane na końcu ciągu. Funkcjonować dostaje () wstawia sekwencję znaków odczytywanych z klawiatury do parametru ciągu i zwraca wskaźnik do tego ciągu (jeśli operacja się powiodła) lub NULL (w przypadku błędu). W poniższym przykładzie po pomyślnym zakończeniu operacji na ekranie wyświetlą się dwie identyczne linie:

#włączać int main() ( char s; char *p; p=gets(s); printf(" \n Wprowadzono ciąg %s. ",s); if (p) printf(" \n Wprowadzono ciąg %s. ", p); zwróć 0; )

Na marginesie zauważamy, że funkcja gets jest często używana do wprowadzania dowolnych danych z klawiatury w postaci ciągu w celu dalszej konwersji przez funkcję sscanf na żądany format lub do wstępnej analizy danych wejściowych, na przykład:

#włączać #włączać #włączać int main() ( char s; int x, err; do ( printf(" \n Wprowadź liczbę całkowitą -> "); pobiera(s); err=sscanf(s, "%d",&x); if (err !=1) printf(" \n Błąd wprowadzania. "); ) while (err!=1); printf("\n Wprowadzono liczbę całkowitą -> %d", x); zwróć 0; )

Drukowanie ciągów na standardowe wyjście (ekran monitora)

Aby wyprowadzić łańcuchy na standardowe wyjście (ekran monitora), możesz użyć dwóch funkcji printf oraz stawia. W funkcji printf jako format przekazywany jest "%s". Wygoda korzystania z tej funkcji polega na tym, że oprócz ciągu można od razu wyświetlić dane innych typów. funkcja funkcja stawia polega na tym, że po wyprowadzeniu linii następuje automatyczne przejście do następnej linii.

Funkcje ciągów

Do konwersji ciągów w języku C dostępna jest biblioteka ciągów. Każda z funkcji ma swój własny format zapisu (prototyp).

W tym artykule omówiono najczęściej używane funkcje. - czytać

Przykład programów (listing) pracujących ze stringami

Współczesny standard C++ definiuje klasę z funkcjami i właściwościami (zmiennymi) do organizowania pracy z łańcuchami (w klasycznym języku C nie ma łańcuchów jako takich, są tylko tablice znaków):

#włączać

#włączać

#włączać

Aby pracować z ciągami, musisz również uwzględnić standardową przestrzeń nazw:

Korzystanie z przestrzeni nazw std;

W przeciwnym razie będziesz musiał podać wszędzie deskryptor klasy std::string zamiast string.

Poniżej znajduje się przykład programu, który działa z łańcuchem (nie działa w starych kompilatorach zgodnych z C!):

#włączać #włączać #włączać używając standardowej przestrzeni nazw; int main() (ciąg s = "Test"; s.insert(1,"!"); cout<< s.c_str() << endl; string *s2 = new string("Hello"); s2->kasuj(s2->end()); Cout<< s2->c_str(); cin.get(); zwróć 0; )

Główne cechy, które posiada klasa string:

  • inicjalizacja tablicą znaków (łańcuch typu wbudowanego) lub innym obiektem typ ciągu. Wbudowany typ nie ma drugiej możliwości;
  • kopiowanie jednej linii do drugiej. Dla typu wbudowanego musisz użyć funkcji strcpy();
  • dostęp do poszczególnych znaków ciągu do czytania i pisania. We wbudowanej tablicy odbywa się to za pomocą operacji indeksowania lub adresowania pośredniego za pomocą wskaźnika;
  • porównywanie dwóch ciągów pod kątem równości. W przypadku typu wbudowanego używane są funkcje rodziny strcmp();
  • konkatenacja (konkatenacja) dwóch ciągów, dająca wynik albo jako trzeci ciąg, albo zamiast jednego z oryginalnych. W przypadku typu wbudowanego używana jest funkcja strcat(), aby uzyskać wynik w Nowa linia, musisz sekwencyjnie używać funkcji strcpy() i strcat(), a także zadbać o alokację pamięci;
  • wbudowane środki do określania długości łańcucha (funkcje składowe klasy size() i l ength()). Jedynym sposobem sprawdzenia długości wbudowanego ciągu znaków jest obliczenie go za pomocą funkcji strlen();
  • możliwość sprawdzenia, czy ciąg jest pusty.

Rozważ te podstawowe funkcje w szczegółach.

Inicjalizacja ciągu opisując i Długość łańcucha(bez końcowego terminatora zerowego):

String st("Mój ciąg\n"); Cout<< "Длина " << st << ": " << st.size() << " символов, включая символ новой строки\n";

Ciąg może być również pusty:

Ciąg st2;

Aby sprawdzić, czy czy ciąg jest pusty?, możesz porównać jego długość z 0:

if (!st.size()) // pusty

lub użyj metody empty(), która zwraca true dla pustego ciągu i false dla niepustego:

if (st.empty()) // puste

Trzecia forma tworzenia ciągu inicjuje obiekt typu string z innym obiektem tego samego typu:

Ciąg st3(st);

Łańcuch st3 jest inicjowany łańcuchem st . Jak możemy się upewnić, że te ciągi pasują? Użyjmy operatora porównania (==):

Jeśli (st == st3) // inicjalizacja się powiodła

Jak skopiuj jedną linię do drugiej? Za pomocą zwykłego operatora przypisania:

st2 = st3; // skopiuj st3 do st2

Do konkatenacja ciągów używany jest operator dodawania (+) lub operator dodawania-przypisania (+=). Niech podane zostaną dwie linie:

Ciąg s1("cześć, "); ciąg s2("świat\n");

Możemy otrzymać trzeci ciąg składający się z konkatenacji pierwszych dwóch, a więc:

Ciąg s3 = s1 + s2;

Jeśli chcemy dodać s2 na koniec s1 , musimy napisać:

S1 += s2;

Operacja dodawania może łączyć obiekty klasy strunowy nie tylko między sobą, ale także ze stringami typu wbudowanego. Możesz przepisać powyższy przykład, aby znaki specjalne i znaki interpunkcyjne były reprezentowane przez wbudowany typ char * , a znaczące słowa były obiektami klasy string:

Const char *pc = ", "; ciąg s1("cześć"); ciąg s2("świat"); ciąg s3 = s1 + pc + s2 + "\n"; Cout<< endl << s3;

Takie wyrażenia działają, ponieważ kompilator "wie", jak automatycznie konwertować obiekty typu wbudowanego na obiekty klasy string . Możliwe jest również proste przypisanie wbudowanego ciągu do obiektu ciągu:

Ciąg s1; const char *pc = "tablica znaków"; s1=szt; // prawo

Odwrotna transformacja to nie działa. Próba wykonania następującej wbudowanej inicjalizacji ciągu typu spowoduje błąd kompilacji:

Znak*str = s1; // błąd kompilacji

Aby wykonać tę konwersję, musisz jawnie wywołać funkcję członkowską o nazwie c_str() ("ciąg C"):

Const char *str = s1.c_str();

Funkcja c_str() zwraca wskaźnik do tablicy znaków zawierającej ciąg obiektu ciągu, tak jak we wbudowanym typie ciągu. Słowo kluczowe const tutaj zapobiega „niebezpiecznej” możliwości w nowoczesnych środowiskach wizualnych bezpośredniej modyfikacji zawartości obiektu za pomocą wskaźnika.

Do poszczególne postacie obiekt typu string , podobnie jak typ wbudowany, można uzyskać za pomocą operacji indeksowania. Na przykład, oto fragment kodu, który zastępuje wszystkie kropki podkreśleniami:

String str("www.disney.com"); int rozmiar = str.rozmiar(); dla (int i = 0; i< size; i++) if (str[i] == ".") str[ i ] = "_"; cout << str;

Replace(str.begin(), str.end(), ".", "_");

To prawda, że ​​nie jest tu użyta metoda replace klasy string, ale algorytm o tej samej nazwie:

#włączać

Ponieważ obiekt ciągu zachowuje się jak kontener, można do niego zastosować inne algorytmy. Pozwala to rozwiązywać problemy, których nie rozwiązują bezpośrednio funkcje klasy string.

Poniżej znajduje się krótki opis głównych operatorów i funkcji klasy string, linki w tabeli prowadzą do opisów w języku rosyjskim w Internecie. Pełniejszą listę możliwości klasy string można znaleźć na przykład w Wikipedii lub cplusplus.com.

Określanie znaków w ciągu

operator=

przypisuje wartości do ciągu

przydzielać

przypisuje znaki do ciągu

Dostęp do poszczególnych postaci

w

uzyskanie określonego znaku ze sprawdzaniem indeksu poza granicami

operator

uzyskanie określonego znaku

przód

uzyskanie pierwszego znaku

plecy

uzyskanie ostatniego znaku

dane

zwraca wskaźnik do pierwszego znaku ciągu

c_str

zwroty niemodyfikowalny Tablica znaków C zawierająca znaki ciągu

Sprawdzanie pojemności sznurka

pusty

sprawdza, czy ciąg jest pusty

rozmiar
długość

zwraca liczbę znaków w ciągu

największy rozmiar

zwraca maksymalną liczbę znaków

rezerwa

rezerwuje miejsce do przechowywania

Operacje na sznurku

jasne

czyści zawartość ciągu

wstawić

wstawianie znaków

usuwać

usuwanie znaków

push_back

dodanie znaku na końcu łańcucha

pop_back

usuwa ostatni znak

dodać

operator+=

dodaje znaki na końcu ciągu

porównywać

porównuje dwie struny

zastąpić

zastępuje każde wystąpienie określonego znaku

substr

zwraca podciąg

Kopiuj

kopiuje znaki

Zmień rozmiar

zmienia liczbę przechowywanych znaków

»Wiarygodna agencja SEO w Indiach może zwiększyć przychody małych firm

80% użytkowników szuka w Google i innych wyszukiwarkach przed dokonaniem zakupu, a ponad 50% zapytań generowanych przez wyszukiwarki zostaje przekonwertowanych. Te dwie statystyki potwierdzają znaczenie optymalizacji pod kątem wyszukiwarek. Istnieje wiele takich statystyk i faktów, które jasno pokazują: każda mała, średnia lub duża firma potrzebuje profesjonalnych usług SEO. Małe firmy i startupy często borykają się z problemami budżetowymi. Mogą skorzystać z pomocy dowolnej godnej zaufania agencji SEO z Indii, aby uzyskać najlepszą usługę SEO w swoim budżecie, aby zwiększyć swoje przychody.
Wyszukiwanie ma ogromny wpływ na umysły konsumentów. Według różnych statystyk udostępnionych przez głównych ekspertów ds. optymalizacji pod kątem wyszukiwarek na różnych autoryzowanych stronach internetowych, takich jak Search Engine Land, Moz, SEO Journal, Digital Marketers India, Hubspot itp. SEO przechwytuje większość potencjalnych klientów. Również leady pochodzące z organicznych wyników wyszukiwania mają wyższy współczynnik konwersji. Te statystyki i zachowania konsumentów wyraźnie pokazują, że najlepsza usługa SEO nie jest luksusem, ale koniecznością dla każdej firmy.
Aby ominąć konkurencję i zwiększyć rozwój biznesu, każda organizacja musi korzystać z usług Search Engine Optimization. Duże marki mogą zainwestować wystarczająco dużo pieniędzy w specjalistyczną usługę SEO oferowaną przez czołową firmę SEO lub specjalistę SEO, ale właściciele małych firm często godzą się na jakość tej usługi ze względu na mniejszy budżet. To trudny fakt, że małe firmy i start-upy w końcu zostawiają możliwości, które można stworzyć dzięki profesjonalnej usłudze SEO lub skorzystaniu z taniej usługi SEO, która nie przynosi żadnych pozytywnych rezultatów.
Właściciele małych firm i startupy mogą korzystać z profesjonalnych usług SEO nawet przy ograniczonym budżecie. Najlepszym rozwiązaniem jest znalezienie godnej zaufania firmy SEO z siedzibą w Indiach. W Indiach jest wielu ekspertów SEO, którzy współpracują z agencją marketingu cyfrowego i oferują najlepsze w branży usługi. Mogą zapewnić wymagane usługi SEO w Twoim budżecie. Płace można negocjować z agencją SEO Indie, aby uzyskać lepsze usługi po niższych stawkach. Jednak nie daj się nabrać na tanią usługę SEO, która kosztuje mniej i obiecuje dawać więcej, ponieważ wiedza specjalistyczna odbywa się na własny koszt. Musisz zapoznać się z portfolio lub zadać odpowiednie pytania przed zawarciem umowy z firmą dla swojej firmy.
Eksperci SEO w Indiach znają się na najlepszych praktykach optymalizacji wyszukiwarek. Ponadto w Indiach jest kilku specjalistów SEO, takich jak Ash Vyas, którzy specjalizują się w tworzeniu najlepszej strategii optymalizacji wyszukiwarek dla firmy o określonym budżecie. Specjaliści SEO stworzą jasny plan, a także podzielą się oczekiwanymi rezultatami. W ten sposób możesz być dobrze świadomy swojej inwestycji i zwrotów. Pomaga to w podjęciu lepszej decyzji biznesowej.
Dobrym pomysłem jest jak najszybsze znalezienie i zawarcie umowy z godną zaufania firmą SEO z Indii, która oferuje najlepsze usługi SEO. Możesz również zacząć od małego budżetu i ograniczonych działań, aby zacząć indeksować swoje strony internetowe i poprawiać słowa kluczowe w wyszukiwarkach. Nie czekaj na idealny czas lub dzień, kiedy będziesz miał tysiące dolarów na zainwestowanie w najlepsze usługi SEO. Wczesne rozpoczęcie pracy pomoże Ci uzyskać szybsze wyniki, gdy możesz agresywnie stosować swoje podejście marketingowe. Godna zaufania firma SEO z siedzibą w Indiach pomoże Ci określić Twoje obecne i przyszłe plany, aby uzyskać dobre wyniki. Więcej zindeksowanych stron poprawiło rankingi i wiarygodną markę Twojej firmy stworzoną dzięki ciągłym profesjonalnym praktykom SEO, podwoi zapytania, biznes i przychody. Każda mała firma może zacząć od dwucyfrowej inwestycji w profesjonalne usługi SEO. Istnieje wiele agencji SEO w Indiach, które oferują niski budżet, ale wynikają z usług zorientowanych na Search Engine Optimization.

ankiety z wygnania

  • CraigWew

    12.04.2018

    »Znaczenie nawiązania relacji z klientem w zakresie nieruchomości i sprzedaży ogólnej

    Znaczenie nawiązania relacji z klientem.
    Na nawiązanie relacji z klientem trzeba zapracować i traktować je jako bardzo integralną część procesu sprzedaży.
    Aby skłonić klienta i siebie do relacji na zasadzie jeden do jednego, wiążą się dwie rzeczy!
    Po pierwsze, musisz być świadomy i być tam! Po drugie, musisz zrozumieć, że podczas tego procesu wystąpią dwa różne etapy.
    A-Bądź tam- co to znaczy?
    o Większość ludzi tak naprawdę nie słucha drugiej osoby podczas rozmowy. Na ogół są tak zajęci formułowaniem następnej odpowiedzi lub stwierdzenia, że ​​prawdopodobnie nie są w stanie naprawdę słuchać.
    o Jeśli to brzmi jak ty, bycie tam oznacza zamknij się i słuchaj!
    B-Jaki jest pierwszy lub początkowy etap?
    o Generalnie masz tylko kilka minut, aby ugruntować się w umyśle klientów jako osoba, z którą chcą mieć do czynienia.
    o W razie wątpliwości najlepiej jest najpierw zadać pytania, które wyciągną je i porozmawiają o sobie.
    o Zawsze bezpiecznie jest występować jako profesjonalista – nie mam na myśli stoickiego czy oschłego, ale kogoś, kto wie, co robi, mówi i wygląda dobrze.
    C-Pozostałe etapy
    o W miarę upływu czasu, poprzez rozmowę i pytania, które będą mieli, albo ustalisz swoje umiejętności, albo nie.
    o Miej świadomość, że prawdopodobnie będą cię mierzyć przez jakiś czas. Dobrą wiadomością jest to, że w pewnym momencie, jeśli odniesiesz sukces w nawiązaniu kontaktu, zrelaksują się i oboje możecie skoncentrować się na znalezieniu lub sprzedaży domu.
    Co jeszcze może mi pomóc w nawiązaniu kontaktu?
    o Próbując zrozumieć różne typy osobowości, a następnie mówiąc i zadając właściwe pytania.
    o Jeśli masz dobre relacje (nadajesz się na tej samej długości fali co klient), wtedy sprzedaż w zasadzie się skończyła, teraz jest to tylko kwestia znalezienia odpowiedniego domu lub wypełnienia dokumentów ofertowych.
    A co z różnymi osobowościami?
    o Ponieważ nie jest to książka o psychiatrii, na razie rozumiem tylko dwa główne typy.
    o Są ludzie introwertyczni i ekstrawertyczni.
    o Znasz typ. Pomyśl o trzech znanych Ci osobach, które pasują do każdej klasyfikacji.
    A co z mową ciała i wzorcami mowy?
    o Jeśli mówią szybko lub wolno, spróbuj naśladować ich wzorce mowy.
    o Jeśli mówią głośno lub cicho, zrób to samo. Czy pochylają się do przodu czy do tyłu?
    o Nie trzeba dodawać, że na ten temat napisano wiele książek. Po prostu pamiętaj, że jest to ważny czynnik — zwłaszcza, gdy siedzisz w sali konferencyjnej lub w czyimś domu omawiasz umowę o wartości 400 000 USD.
    Rozwijanie relacji to umiejętność, której można się nauczyć i doskonalić.
    o Wszyscy mieliśmy do czynienia ze sprzedawcą, który nam coś sprzedał, a mimo to nie czuliśmy, że jesteśmy sprzedawani. Powodem jest to, że sprawił, że poczułeś się komfortowo tam, gdzie im ufałeś.
    Jak budujemy relacje?
    o Używaj oczu i uszu i zadawaj pytania. wytłumaczyć
    o Użyj oczu:
    Spójrz na ich ubiór – ich samochód – ich rzeczy osobiste i naprawdę mam na myśli patrz na nich i rozszyfruj, co to ci o nich mówi.
    o Użyj uszu:
    o Słuchaj tego, co mówią i zadawaj pytania, aby dotrzeć do sedna ich prawdziwej MOTYWACJI!
    Teraz podczas całej tej rozmowy prawdopodobnie odkryjesz jedną lub dwie rzeczy, które masz z nimi wspólne. (Rodzina, obszary geograficzne, wędkarstwo itp.) Kiedy natkniesz się na wspólną płaszczyznę, daj im znać, że jesteś zaznajomiony, a następnie poświęć chwilę na przedyskutowanie tego z nimi.
    Jaki jest cel?
    o Gdy zaakceptują Cię jako jednego z nich, będziesz mieć naprawdę świetne doświadczenie w sprzedaży, ponieważ teraz pracujesz razem, a potem jako zespół — nie jesteś już sprzedawcą, a teraz zajmujesz stanowisko doradcze .
    o Pamiętaj, że klient albo pozwoli, albo nie pozwoli Ci wejść do swojego świata. Jeśli to zrozumiesz i naprawdę ciężko pracujesz, aby stać się wobec niego empatycznym, możesz zdobyć pozycję zaufania. W większości przypadków zobaczysz, jak się rozluźniają (mowa ciała), gdy tak się dzieje, gdy jesteś w drodze.
    o Aby to zilustrować, czy kiedykolwiek wygłosiłeś przemówienie i zauważyłeś, że kiedy w końcu nawiązałeś kontakt z publicznością, przytakną z aprobatą. Te rzeczy mogą wydawać się banalne, ale tak nie jest.
    Podsumowując, jeśli możesz zdobyć zaufanie klientów, sprzedaż produktu lub usługi jest znacznie łatwiejsza, a doświadczenie może być przyjemne dla wszystkich zaangażowanych.
    Zawsze pamiętaj, że wygrana/wygrana to najlepsza sytuacja.

Wstrzymaj AdBlock w tej witrynie.

A więc napisy w języku C. Nie mają oddzielnego typu danych, jak ma to miejsce w wielu innych językach programowania. W języku C napis jest tablicą znaków. Do oznaczenia końca wiersza używany jest znak „\0”, o którym mówiliśmy w ostatniej części tej lekcji. Nie jest w żaden sposób wyświetlany na ekranie, więc nie będzie działać.

Tworzenie i inicjowanie ciągu

Ponieważ łańcuch jest tablicą znaków, deklarowanie i inicjowanie łańcucha jest podobne do podobnych operacji z tablicami jednowymiarowymi.

Poniższy kod ilustruje różne sposoby inicjowania ciągów.

Lista 1.

Charstr; char str1 = ("Y","o","n","g","C","o","d","e","r","\0"); char str2 = "Cześć!"; char str3 = "Witaj!";

Rys.1 Deklaracja i inicjalizacja ciągów

W pierwszym wierszu po prostu deklarujemy tablicę dziesięciu znaków. To nawet nie jest sznurek, bo nie ma znaku null \0 , o ile jest to tylko zestaw znaków.

Druga linia. Najprostszy sposób na inicjalizację na czole. Każdy symbol deklarujemy osobno. Najważniejsze, żeby nie zapomnieć o dodaniu znaku zerowego \0 .

Trzecia linia jest podobna do drugiej. Zwróć uwagę na zdjęcie. Dlatego w ciągu po prawej stronie jest mniej znaków niż w tablicy, pozostałe elementy zostaną wypełnione \0 .

Czwarta linia. Jak widać, rozmiar nie jest tutaj ustawiony. Program obliczy go automatycznie i utworzy tablicę znaków o wymaganej długości. Spowoduje to wstawienie znaku zerowego \0 na końcu.

Jak wyprowadzić ciąg?

Dodajmy powyższy kod do pełnoprawnego programu, który wyświetli wygenerowane ciągi na ekranie.

Lista 2.

#włączać int main(void) ( char str; char str1 = ("Y","o","n","g","C","o","d","e","r"," \0"); char str2 = "Hello!"; char str3 = "Hello!"; for(int i = 0; i< 10; i = i + 1) printf("%c\t",str[i]); printf("\n"); puts(str1); printf("%s\n",str2); puts(str3); return 0; }


Rys. 2 Różne sposoby wyświetlania ciągu na ekranie

Jak widać, istnieje kilka podstawowych sposobów wyświetlania napisu na ekranie.

  • użyj funkcji printf ze specyfikatorem %s
  • użyj funkcji puts
  • użyj funkcji fputs, podając stdout jako drugi parametr.

Jedynym zastrzeżeniem są funkcje puts i fputs. Zauważ, że funkcja puts zawija dane wyjściowe do następnego wiersza, ale funkcja fputs nie.

Jak widać, wynik jest dość prosty.

Wprowadzanie ciągów

Z wejściem łańcuchowym sytuacja jest trochę bardziej skomplikowana niż z wyjściem. Najprostszy sposób byłby następujący:

Lista 3.

#włączać int main(void) ( char str; pobiera(str); puts(str; return 0; )

Funkcja gets wstrzymuje program, odczytuje ciąg znaków wprowadzonych z klawiatury i umieszcza go w tablicy znaków, której nazwa jest przekazywana do funkcji jako parametr.
Funkcja gets kończy się znakiem odpowiadającym klawiszowi enter i zapisywany w ciągu jako znak null.
Zauważyłeś niebezpieczeństwo? Jeśli nie, kompilator uprzejmie cię o tym ostrzeże. Dzieje się tak, ponieważ funkcja gets kończy działanie tylko wtedy, gdy użytkownik naciśnie klawisz Enter. Jest to obarczone tym, że możemy wyjść poza tablicę, w naszym przypadku - jeśli wpiszemy więcej niż 20 znaków.
Nawiasem mówiąc, wcześniejsze błędy przepełnienia bufora były uważane za najczęstszy rodzaj luki. Nadal można je znaleźć, ale znacznie trudniej jest ich używać do hakowania programów.

Więc co mamy. Mamy zadanie: napisać ciąg do tablicy o ograniczonym rozmiarze. Oznacza to, że musimy w jakiś sposób kontrolować liczbę znaków wprowadzanych przez użytkownika. I tu z pomocą przychodzi funkcja fgets:

Lista 4.

#włączać int main(void) ( char str; fgets(str, 10, stdin); puts(str; return 0; )

Funkcja fgets przyjmuje jako dane wejściowe trzy argumenty: zmienną do zapisania łańcucha, rozmiar napisu do zapisania oraz nazwę strumienia, z którego mają zostać pobrane dane do zapisania w łańcuchu, w tym przypadku stdin . Jak już wiesz z lekcji 3, stdin jest standardowym strumieniem wejściowym, zwykle powiązanym z klawiaturą. Nie jest konieczne, aby dane pochodziły ze strumienia stdin, w przyszłości będziemy również wykorzystywać tę funkcję do odczytywania danych z plików.

Jeśli podczas wykonywania tego programu wprowadzimy ciąg dłuższy niż 10 znaków, do tablicy zostanie jeszcze tylko 9 znaków od początku i znak łamania wiersza, fgets „obtnie” ciąg do wymaganej długości.

Zauważ, że funkcja fgets nie odczytuje 10 znaków, ale 9 ! Jak pamiętamy, w łańcuchach ostatni znak jest zarezerwowany dla znaku null.

Sprawdźmy to. Uruchommy program od ostatniego zestawienia. I wprowadź ciąg 1234567890 . Na ekranie zostanie wyświetlony ciąg 123456789.


Rys.3 Przykład działania funkcji fgets

Pojawia się pytanie. Gdzie podziała się dziesiąta postać? A ja odpowiem. Nigdzie nie odszedł, pozostał w strumieniu wejściowym. Uruchom następujący program.

Lista 5.

#włączać int main(void) ( char str; fgets(str, 10, stdin); puts(str); int h = 99; printf("do %d\n", h); scanf("%d",&h) ; printf("po %d\n", h); zwróć 0; )

Oto efekt jej pracy.


Rys.4 Niepusty bufor stdin

Pozwól, że wyjaśnię, co się stało. Nazwaliśmy funkcję fgets. Otworzyła strumień wejściowy i czekała, aż wprowadzimy dane. Wprowadziliśmy 1234567890\n z klawiatury (\n oznacza Enter ). To poszło do wejścia strumienia wejściowego stdin . Funkcja fgets, zgodnie z oczekiwaniami, wzięła pierwsze 9 znaków 123456789 ze strumienia wejściowego, dodała do nich znak null \0 i zapisała to w łańcuchu str . W strumieniu wejściowym wciąż pozostaje 0\n.

Następnie deklarujemy zmienną h . Wyświetlamy jego wartość na ekranie. Następnie wywołujemy funkcję scanf. Tutaj oczekuje się, że możemy coś wpisać, ale skoro 0\n zawiesza się w strumieniu wejściowym, wtedy funkcja scanf przyjmuje to jako nasze dane wejściowe i zapisuje 0 do zmiennej h . Następnie wyświetlamy go na ekranie.

To oczywiście nie jest dokładnie takie zachowanie, jakiego oczekujemy. Aby poradzić sobie z tym problemem, konieczne jest wyczyszczenie bufora wejściowego po odczytaniu z niego ciągu wprowadzonego przez użytkownika. W tym celu użyj funkcji specjalnej fflush . Ma tylko jeden parametr - strumień do wyczyszczenia.

Poprawmy ostatni przykład, aby jego działanie było przewidywalne.

Lista 6.

#włączać int main(void) ( char str; fgets(str, 10, stdin); fflush(stdin); // wyczyść strumień wejściowy puts(str); int h = 99; printf("do %d\n", h) ; scanf("%d",&h); printf("po %d\n", h); return 0; )

Teraz program będzie działał tak, jak powinien.


Rys.4 Opróżnianie bufora stdin za pomocą funkcji fflush

Podsumowując, można zauważyć dwa fakty. Pierwszy. Obecnie używanie funkcji gets jest niebezpieczne, dlatego zaleca się używanie funkcji fgets wszędzie.

Drugi. Nie zapomnij wyczyścić bufora wejściowego, jeśli używasz funkcji fgets.

Na tym kończy się rozmowa na temat wprowadzania ciągów. Pójść dalej.

Ostatnia aktualizacja: 31.10.2015

Powiązanie

Konkatenację lub konkatenację ciągów można wykonać za pomocą operatora + lub metody Concat:

Ciąg s1 = "cześć"; ciąg s2 = "świat"; ciąg s3 = s1 + " " + s2; // wynik: string "witaj świecie" string s4 = String.Concat(s3, "!!!"); // wynik: napis "Witaj świecie!!!" Konsola WriteLine(s4);

Metoda Concat jest statyczną metodą klasy String, która jako parametry przyjmuje dwa ciągi znaków. Istnieją również inne wersje metody, które przyjmują inną liczbę parametrów.

Metoda Join może być również używana do łączenia ciągów:

Ciąg s5 = "jabłko"; ciąg s6 = "dzień"; ciąg s7 = "zachowuje"; ciąg s8 = "lekarz"; ciąg s9 = "z dala"; wartości ciągu = nowy ciąg ( s5, s6, s7, s8, s9 ); String s10 = String.Join(" ", wartości); // wynik: ciąg "jabłko dziennie trzyma lekarza z dala"

Metoda Join jest również statyczna. Wersja metody użytej powyżej przyjmuje dwa parametry: ciąg znaków ogranicznika (w tym przypadku spację) oraz tablicę ciągów, które zostaną połączone i oddzielone ogranicznikiem.

Porównanie ciągów

Aby porównać ciągi, użyj statycznej metody Compare:

Ciąg s1 = "cześć"; ciąg s2 = "świat"; int wynik = String.Compare(s1, s2); jeśli (wynik<0) { Console.WriteLine("Строка s1 перед строкой s2"); } else if (result >0) ( Console.WriteLine("Linia s1 następuje po linii s2"); ) else ( Console.WriteLine("Linie s1 i s2 są identyczne"); ) // wynikiem będzie "Linia s1 jest przed linią s2"

Ta wersja metody Compare pobiera dwa ciągi i zwraca liczbę. Jeśli pierwszy ciąg jest alfabetycznie wyższy niż drugi, zwracana jest liczba mniejsza od zera. W przeciwnym razie zwracana jest liczba większa od zera. I trzeci przypadek - jeśli ciągi są równe, to zwracana jest liczba 0.

W tym przypadku, ponieważ znak h jest alfabetycznie wyższy niż znak w, pierwszy wiersz również będzie wyższy.

Szukaj w ciągu

Za pomocą metody IndexOf możemy określić indeks pierwszego wystąpienia pojedynczego znaku lub podciągu w ciągu:

String s1 = "Witaj świecie"; znak ch = "o"; int indexOfChar = s1.IndexOf(ch); // równa się 4 Console.WriteLine(indexOfChar); string subString = "wor"; int indexOfSubstring = s1.IndexOf(subString); // równa się 6 Console.WriteLine(indexOfSubstring);

Metoda LastIndexOf działa w podobny sposób, znajduje tylko indeks ostatniego wystąpienia znaku lub podciągu w ciągu.

Kolejna grupa metod pozwala dowiedzieć się, czy ciąg zaczyna się, czy kończy określonym podciągiem. Do tego służą metody StartsWith i EndsWith. Na przykład mamy zadanie usunięcia wszystkich plików z rozszerzeniem .exe z folderu:

Ścieżka ciągu = @"C:\SomeDir"; pliki ciągów = Directory.GetFiles(ścieżka); dla (int i = 0; i< files.Length; i++) { if(files[i].EndsWith(".exe")) File.Delete(files[i]); }

Dzielenie linii

Za pomocą funkcji Split możemy podzielić ciąg na tablicę podciągów. Jako parametr funkcja Split przyjmuje tablicę znaków lub ciągów, które będą służyć jako separatory. Na przykład policzmy liczbę słów w wyrażeniu, dzieląc je przez znaki odstępu:

String text = "I dlatego to wszystko się stało"; string words = text.Split(new char ( " ")); foreach (ciąg s w słowach) ( Console.WriteLine(s); )

Nie jest to najlepszy sposób na dzielenie przez spacje, ponieważ moglibyśmy mieć kilka kolejnych spacji w ciągu wejściowym, a spacje również znalazłyby się w końcowej tablicy, więc lepiej użyć innej wersji metody:

String words = text.Split(new char ( " " ), StringSplitOptions.RemoveEmptyEntries);

Drugi parametr StringSplitOptions.RemoveEmptyEntries mówi, aby usunąć wszystkie puste podciągi.

Przycinanie sznurka

Aby przyciąć początkowe lub końcowe znaki, użyj funkcji Przytnij:

String text = "Witaj świecie"; tekst = tekst Przytnij(); // wynik "hello world" text = text.Trim(new char ( "d", "h" )); // wynik "ello world"

Funkcja Trim bez parametrów przycina początkowe i końcowe spacje i zwraca przycięty ciąg. Aby jawnie określić, które znaki początku i końca mają zostać przycięte, możemy przekazać do funkcji tablicę tych znaków.

Ta funkcja ma częściowe analogi: funkcja TrimStart przycina znaki początkowe, a funkcja TrimEnd przycina znaki końcowe.

Funkcja Substring umożliwia przycięcie określonej części ciągu:

Tekst ciągu = "Miły dzień"; // skróć zaczynając od trzeciego znaku text = text.Substring(2); // wynik "miłego dnia" Console.WriteLine(text); // skróć od pierwszych do dwóch ostatnich znaków text = text.Substring(0, text.Length - 2); // wynik to "dobry de" Console.WriteLine(text);

Funkcja Substring zwraca również przycięty ciąg. Jako parametr pierwsza używana wersja używa indeksu, z którego ma zostać przycięty ciąg. Druga wersja wykorzystuje dwa parametry - indeks początku cięcia i długość ciętej części sznurka.

Wstawić

Aby wstawić jeden wiersz do drugiego, użyj funkcji Wstaw:

Tekst ciągu = "Miły dzień"; string subString = "wspaniały"; tekst = tekst.Wstaw(8, podciąg); Konsola.WriteLine(tekst);

Pierwszym parametrem w funkcji Insert jest indeks, w którym należy wstawić podciąg, a drugim parametrem jest sam podciąg.

Usuwanie wierszy

Metoda Remove pomaga usunąć część ciągu:

Tekst ciągu = "Miły dzień"; // indeks ostatniego znaku int ind = text.Length - 1; // wytnij ostatni znak text = text.Remove(ind); Konsola.WriteLine(tekst); // wytnij pierwsze dwa znaki text = text.Remove(0, 2);

Pierwsza wersja metody Remove pobiera indeks w ciągu, z którego mają zostać usunięte wszystkie znaki. Druga wersja przyjmuje jeszcze jeden parametr - ile znaków należy usunąć.

Zastąpienie

Aby zastąpić jeden znak lub podciąg innym, użyj metody Replace:

String text = "miłego dnia"; text = text.Replace("dobry", "zły"); Konsola.WriteLine(tekst); tekst = tekst.Zamień("o", ""); Konsola.WriteLine(tekst);

W drugim przypadku użycia funkcji Replace, ciąg jednego znaku „o” jest zastępowany ciągiem pustym, czyli faktycznie jest usuwany z tekstu. W podobny sposób łatwo jest usunąć określony tekst w wierszach.

Zmiana przypadku

Aby przekonwertować ciąg na wielkie i małe litery, używane są funkcje ToUpper() i ToLower(), odpowiednio:

String hello = "Witaj świecie!"; Console.WriteLine(hello.ToLower()); // Witaj świecie! Console.WriteLine(witaj.ToUpper()); // WITAJ ŚWIECIE!