Funzioni per la gestione delle stringhe in C ++




функции strlen (), strcat (), strcpy (), strcmp () в C++

dopo, come ci conosciamo stringhe e array di caratteri in C ++, guardare le funzioni più comuni per lavorare con loro. La lezione sarà completamente costruito in pratica. Vi scrivere i propri programmi-analoghi per il trattamento delle linee e parallelo l'utilizzo di funzioni di libreria standard CString (string.h – nelle versioni più vecchie). Così si sta per presentarsi, come funzionano. Le funzioni della libreria standard CString sono:

  • strlen() – calcola la lunghezza della stringa (numero di caratteri escluso \0);
  • strcat() – Esso combina le stringhe;
  • strcpy() – copia i simboli di una linea all'altra;
  • strcmp() – confronta due stringhe .

E 'certamente non tutte le caratteristiche, solo quelli, che è coperto in articolo.

strlen() (la lunghezza delle parole – lunghezza)

Il nostro programma, che calcola il numero di caratteri per riga:

Per calcolare i caratteri di una stringa di lunghezza indeterminata (l'utente immette essa), abbiamo usato il ciclo mentre – linee 13 – 17. Si passa attraverso tutte le celle della matrice (tutti i caratteri della stringa) alternativamente, partendo da zero. Quando ad un certo ciclo di passo per soddisfare Box ourStr [amountOfSymbol], che memorizza simbolo \0, simboli di pausa del ciclo di busto e aumentare il contatore amountOfSymbol.

Quindi il codice sarà simile, la sostituzione di una sezione di codice in funzione strlen():

Come si può vedere, Questo codice. Non ha bisogno di dichiarare le variabili aggiuntive e utilizzare un ciclo. Il flusso di uscita cout siamo passati nella stringa funzione di – strlen(ourStr). Si suggerisce che la lunghezza della linea e di nuovo al numero di programma. Come nel precedente codice-analogico, simbolo \0 escluso il numero totale di caratteri.

Il risultato è il programma in primo e secondo simile:

функция strlen () в C++

strcat() (concatenamento di parole – composto)

programma, che la fine di una riga, aggiunge la seconda linea. in altre parole – Unisce due linee.

Secondo i commenti nel codice dovrebbe essere tutto chiaro. Qui di seguito, scriviamo un programma per eseguire la stessa azione, ma usando strcat(). In questa funzione, daremo due argomenti (due linee) – strcat(someText1, someText2); . La funzione aggiunge una stringa someText2 alla linea someText1. Allo stesso simbolo ' 0' alla fine someText1 Esso sovrascrive il primo carattere someText2. E aggiunge anche una finale ' 0'

Attuazione della unione di due linee, Utilizzando la funzione standard, Presi una riga di codice nel programma – 14-fila.

risultato:

strcat c++, strcat_s c++

Che cosa dovrebbe prestare attenzione al primo e secondo codice – dimensione del primo carattere dell'array dovrebbe essere sufficiente per la seconda serie di sedi caratteri. Se la dimensione è insufficiente – si può verificare la terminazione anomala del programma, dal momento della registrazione la linea di memoria, che occupa il primo array. per esempio:

In questo caso,, costante strokovaya “Imparare il C ++ c noi!” Esso non può essere scritto nella matrice someText1. Poiché non c'è abbastanza spazio, per tali operazioni.

Se si utilizza una versione recente di ambiente di sviluppo Microsoft Visual Studio, si può verificare il seguente errore:: “errore C4996: 'strcat’: Questa funzione o variabile può essere pericoloso. Considerare l'utilizzo strcat_s anziché. Per disabilitare deprecazione, uso _CRT_SECURE_NO_WARNINGS. Vedere la guida in linea per maggiori dettagli.” Questo perché, che ha sviluppato una nuova versione più sicura della funzione strcat – esso strcat_s. Lei si preoccupa, affinché non vi sia buffer overflow (array di caratteri, che ha prodotto record di seconda linea). Ambiente si prevede di utilizzare una nuova funzione, invece del obsoleto. Ulteriori informazioni su questo può essere sul sito Web MSDN. Questo errore può verificarsi, se si utilizza la funzione strcpy, che sarà discusso sotto.

strcpy() (copia Slovenia – copiatura)

Vendi su di una riga e inserirlo al posto di un'altra riga.

Applicare la libreria di funzioni standard di CString:

Prova a compilare e prima, ed un secondo programma. Si vedrà questo risultato:

strcpy C ++

strcmp() (Slovenia confrontare – confronto)

Questa caratteristica è stata progettata in modo da: Si confronta il carattere di due C-string per carattere. Se le stringhe sono identiche (e simboli e il loro numero) – la funzione restituisce il numero di programma 0. Se la prima riga è più di un secondo – restituisce il numero di programma 1, e se meno, il -1. numero -1 allora, quando la lunghezza delle linee è, ma le linee dei caratteri non corrispondono.

strcmp C ++ programma con strcmp():

strcmp C ++

Condividi sui social network i nostri articoli con i tuoi amici, che ha anche imparare le basi della programmazione in C ++.

Sul nostro sito ha già la possibilità di iscriversi, per ricevere la notifica di nuovi articoli. per iscriversi – inserisci il tuo e-mail qui sotto.

Newsletter nuove lezioni sulla programmazione:

data
pagina
Funzioni per la gestione delle stringhe in C ++ (Si-stroki)
valutazione
51stella1stella1stella1stella1stella

20 pensieri su "Funzioni per la gestione delle stringhe in C ++

  1. Ci milyard pezzi, potreste aver perso, ma descriviamo in dettaglio l'ovvio…

    >> programma, che la fine di una riga, aggiunge la seconda linea. In altre parole - combina due linee.

    e così, in altre parole – vari colpi, ma l'essenza non è chiara.
    io 2 char * stringa per ogni assegnato 256 byte.
    Il primo ha registrato “Ciao”, secondo “mondo”.
    Io li unisco. Quanti byte avevo bisogno? 512 o 10?

    Risposta e andare oltre nel testo :).

    1. Vladimir, puntatori argomento in questo articolo non aumenta. Se parliamo di array di caratteri (Si-strokah) dimensione 256 byte ciascuno, dopo la concatenazione di stringhe “Ciao” e ” mondo”, fila in cui i personaggi sono finiti scrittura mondo, avrà 256 byte, così come prima della concentrazione.

      stringa strWorld prende linea cellulare strHello, seguendo i caratteri ciao (strWorld primo carattere della stringa “zatret” \0 dopo il simbolo 'o’ linea strHello).

      Lavorare con i puntatori alle stringhe, naturalmente, migliore quantità perevydelyat di memoria necessaria per memorizzare stringhe di caratteri, e non occupa troppo spazio. Girerà, si deve 12 byte “Ciao mondo”. Tutto in ordine – e arriviamo a questo :)

      P.S. commenti,codice e una spiegazione non è per voi, e per i principianti, che leggere qualcosa su che cosa stiamo parlando

      1. La questione è davvero molto interessante! Non ho mai avuto a pensarci. A prima vista,, in questo disco non è strano. Ma non funziona bene! :) stati di errore “Il buffer è troppo piccolo”. Un mio amico (Vitali) Ho detto così alla domanda: “documentazione scritta, che “Se gli oggetti funzione si sovrappongono, il suo comportamento non è definito.” il programmatore che scrive così risucchiato nel vuoto )) ” Ebbene, anche in modo continuato: “Si va su un carattere. Le ricerche di funzione \0 la prima riga, reperti, carattere per carattere e inizia a incollare la seconda fila. MA! esso colla finché non trova \0 che non esiste più!
        Vova, Siamo grati, Se anche voi, sarà di noi rispondere su questo tema.

  2. Ebbene, il compagno giusto, ha detto, La prima linea copie dei personaggi dal suo inizio alla sua fine, cresce quindi infinitamente.

    La criniera è scritto:
    Le linee non possono sovrapporsi, e dest deve disporre di spazio sufficiente per contenere il risultato.

    In realtà, non c'è un buffer overflow, ma puramente per caso potrebbe funzionare (l'errore non esce), ma il programma viene modificato in qualche modo imprevedibile.

    Dokapalis I, che la descrizione di questa funzione prende linee mana 6. solo, azzeramento contemporaneo (e circa buffer abbastanza grandi e circa l'intersezione delle linee). Si scrive un centinaio di volte la stessa cosa con parole diverse, Non so perché xD.

    >> P.S. commenti,codice e una spiegazione non è per voi, e per i principianti, che leggere qualcosa su che cosa stiamo parlando.

    Stai scrivendo un articolo su convenzioni di codifica. Sembra che alcuni di essi indica il numero ottimale di commenti nel codice. Nessuno scrive per ogni linea.

    A e in non indeksiruetsâ Poiskovik (o mi sbaglio?), quindi basta più redditizio per mettere una descrizione per il codice dopo il codice, non all'interno.

    si scrive, “funzioni per lavorare con le stringhe in C ++”, in realtà erano una volta in , ma in C ++ là , e vecchio (“sishnye”) stringa passata in (Qui e descritto questo tipo strcat, … ). vale a dire. Ho letto il titolo e si aspettano di leggere su std::corda, e qui… (Mi hanno ingannato xD).

    1. quindi niente commenti nel codice per ogni linea )) Ci sono solo un paio di pezzi. P.S. È stato scritto da, che non pensi che se ti ho detto tutto questo spiegare. Sai cosa – è chiaro ))
      Per quanto riguarda il titolo. Per nome certamente può pignoli… Solo se l'articolo era circa la stringa, essa, inoltre, non farò il nome “funzioni per lavorare con le stringhe in C ++”. piuttosto – Metodi per lavorare con gli oggetti stringa stringhe di classe.
      Come si potrebbe chiamare questo articolo? Forse la verità è meglio rinominare.

  3. Ma ho letto un articolo su…

    A proposito di strcpy hai portato qualcosa di tipo analogico, vale a dire. provato squarcio strcpy proprie mani, Ho capito bene?

      1. Non esattamente xD.

        la criniera (di serie sembra troppo) Si dice che le linee non si sovrappongano. In gcc sembra funzionare le linee sovrapposte sottili, ma questo standard può essere un comportamento non definito, e mezzi in un altro compilatore (un'altra versione dello stesso compilatore) оно может сломаться.

        credo che, что по этой теме лучше описать типичные ошибки (с strcpyэто переполнение буффера) и способы борьбы.

        Я бы про поделки мелкософта вспомнил, типа strcpy_s. Если вы пишите код в вижуал студии, то стопудово вам в окно сыпятся предупреждения о том, что strcpy надо заменить на безопасную версию – strcpy_s. Вот про эту штуку можно написать ИМХО.
        Посмотрите тут

      2. ну о strcpy_s и о strcat_sэто мой был к тебе вопрос )) Получается теперь, что вопрос сама себе задала.

        Интересная у тебя манера общения:
        Точно.
        Не точно.

        + Мои вопросы мне же и задаешь

        Vova. Предлагаю общаться так, будто мы очень уважаем друг-друга )

  4. но вцелом статьи стали годнее, код отформатирован хотя бы единообразно :). Более веселых примеров не хватает, что-ли

    Пишите еще :)

      1. >> Vova. Предлагаю общаться так, будто мы очень уважаем друг-друга )

        На Вычто-ли? )

        Про более правильные названия статей ничего не знаю. Я не любитель микростатей, я бы написал под таким названием и про Си-строки, и про string. Придумал бы какой-нибудь пример, в который свел бы кучу строковых функций, а к самим функциям написал бы очень короткие (отнострочные) commenti, свел бы их в таблицу. Написал бы про переполнения буферовэто вобще типичная ошибка при работе со строками, safe-функции от микрософта и еще пример типа… “дан массив строк, надо слить его в одну большую строку” – тут бы остановился на оценке асимптотической сложностипример шикарен и оценка сложности не лежит на поверхности.

        Я не столько вопросы задаю, сколько предлагаю темы для следующих статей (или тезисы к допилу текущей).

      2. comunque – спасибо за конструктивную критику и предложения! Интересно с тобой общаться

  5. Про пример со слиянием массива строк поясню.
    у strcat есть артефакт, ты вот верно уже написала, что перед тем как приступить к слиянию, он заменяет символ . Но чтобы его занменить, его надо найти. А как его найти, если размер строки не известен? – перебрать последовательно все элементы строки.

    Если ты сливаешь 2 linee – первая длиной N, secondo – M, то будет выполнено N + M операций, tk. сначала N операций для поиска , а затем M операций для записи содержимого второй строки в первую.

    sebbene, многие программисты, не заглянув в документацию ожидают M операций, tk. про поиск забывают.

    Соответственно, если у нас есть массив из K строк и выйдет так, что первая строка очень длинная, а остальные очень короткие, то сложность алгоритма будет не очень маленькой (хотя, мы ведь добавляет короткие строки к длинной), а близкой к K * Len, где Lenсумма длинн всех строк. Короче квадратичная сложность вместо линейной.

    А вот в std::string все совсем иначе, хотя сложность останется такой же (su, ведь есть штуки типа memcpy и вектор может расти рывками) несмотря на то, что размер строк известен. Думайте почему, МБ статью новую нарисуете.

    1. Пару строк в защиту Автора!
      Vladimir, обращаюсь к ВамПро более правильные названия статей ничего не знаю” – нечего придираться к придуманному названию, а то выходитмне не нравится, но не знаю как лучше… “я бы написал…”, “придумал бы…”, ” свел бы…” e t. d. etc. Но не написал, не придумал, не свел… (если я слишком категоричен или глубоко не правподелитесь, будьте любезны ссылкой на Вашу статью на аналогичную тему). А кто-то написал, придумал, сделал. А Вы теперь сидиетевесь такой умныйи критикуете. Я бы тоже много чего хорошего сделал…. В то время как кто-то берет и делает! Мне например и статьи очень нравятся и примеры понятные. Изложение куда понятнее чем у моего нынешнего преподавателя по С++ в ВУЗе (еще один комплимент автору). Много тем освоил благодаря этому сайту а не занятиям и конспектам (как не печально). autore, спасибо за Ваш труд! Не останавливайтесь на достигнутом, Ваши старания приносят пользу людям!

  6. первый пример про сравнение 2х строк у меня не компилируется без
    #include но в примере он не указан.

    1. В примерах в литературе (и гораздо более сложных, чем показано) достаточно часто требуемые #include не указываютсясчитается, что вы их впишете сами в необходимом количестве.

      Конкретно то, какие требуются #include, может меняться в зависимости от операционной системы и компилятораа далеко не у всех (per fortuna) MS VisualStudio как у вас.

Lascia un Commento

Inserire il codice nei tag: <pre class="lang:C ++ decodifica:true ">IL TUO CODICE</pre>