Конкатенация (сцепление) строк

Строки

Строковая константа, или строковый литерал, - это нуль или более символов, заключенных в двойные кавычки, как, например, "Это строковая константа” или "" ‑ (пустая строка). Кавычки не входят в строку, а служат только ее ограничителями. Так же, как и в символьные константы, в строки можно включать эскейп-последовательности. \", например, представляет собой двойную кавычку. Строковые константы можно конкатенировать ("сцеплять”) во время компиляции; например, запись двух строк "Здравствуй," " мир!" эквивалентна записи одной следующей строки: "Здравствуй, мир!" Указанное свойство позволяет разбивать длинные строки на части и располагать эти части на отдельных строчках.

Строка – это последовательность символов. Последовательности в Си представляются массивами или указателями.

Неприятно – не получится понять, что такое строка в Си, если не знать, что такое массив, указатель и как они между собой связаны.

Производные типы

Исходя из основных (и определенных пользователем) типов, можно задать другие, производные типы с помощью следующих операций описания:

* указатель & ссылка [] массив () функция

Например:

int* a; // указатель на целое. Его значением является адрес float v[10]; // описание вектора из 10 действительных чисел. char* p[20]; // массив из 20 символьных указателей void f(int); // функция, аргумент – целое, значения не возвращает

Можно описать сразу несколько имен в одном описании. Тогда оно содержит вместо одного имени список отделяемых друг от друга запятыми имен. Например, можно так описать две переменные целого типа:

int x, y; // int x; int y;

Операции описаний производных типов применяются только к данному имени (а вовсе не ко всем остальным именам того же описания). Например:

int * p, y;   // int* p; int y; НО НЕ int* y; int x, *p;   // int x; int* p; int v[10], *p; // int v[10]; int* p;

Такие описания запутывают программу, и, возможно, их следует избегать.

Строка как массив символов

Исторически символ занимает 1 байт, в этом случае он имеет тип char. Существуют и другие кодировки, в которых символ представляется, например, двумя байтами. Для работы с такими строками требуются специальные функции. Мы будем рассматривать только традиционные строки из однобайтовых символов. В дальнейшем для простоты по большей части говорится о массивах, но почти все сказанное относится и к указателям.

Итак, строкf в Си – массив, например

char s[1000];

строка не более чем из 1000 символов. Имя массива s одновременно является указателем на начало массива. Поэтому строку можно описать и так:

char *s;

Но при таком описании ничего неизвестно о длине строки. Очевидно, что последовательность должна быть как-то ограничена, то есть мы должны знать, где она заканчивается. В Си строка ограничивается специальным символом, называемым нуль-терминатором. Это символ с кодом нуль: ‘\0’. Он является последним символом строки. Можно сказать, что Си-строка – это указатель типа char* на область памяти, заканчивающуюся символом с кодом 0.

Над указателями можно совершать некоторые арифметические действия. Так, например, можно подсчитать число символов в строке, не считая завершающего символа ‘\0’:

char* p;

………………// здесь определяется строка p

int i = 0;

while (*p++) i++;

Теперь i  равно длине строки. Для вычисления длины строки имеется библиотечная функция strlen(s).

Другой способ найти длину строки – это найти сначала конец строки, а затем вычесть адрес начала из адреса её конца.

char* p;

int len;

……………………..// здесь определяется строка p

char* q = p;

while (*q++);

len = q ‑ p ‑ 1;}

Для определения длины строки всякий раз необходимо искать ее конец, сравнивая ее символы с нуль-терминатором. Чем длиннее строка ‑ тем больше операций. Об этом следует помнить при использовании длины строки, например, в циклах. Если между итерациями строка не изменяется, ее длину следует вычислить заранее, а потом использовать полученное значение.

 

ПРЕДУПРЕЖДЕНИЕ Не путайте ‘\0’, ‘0’ и “0”. Первое – символьный литерал, соответствующий символу с кодом 0. Второе – такой же литерал, но обозначающий цифру 0, ее код в ASCII-кодировке 48. Третий — это строковый литерал, содержащий два символа, цифру 0 и нуль-терминатор.

Операции со строками

Создание строк

Проиллюстрируем создание строк на фрагментах кода с комментариями.

char str1[10]; // Строка - массив из 10 символов. Начальное значение символов не определено.char str2[10]="Hello";/* Используется инициализация (не присваивание!). В первые 5 символов записывается “Hello”, в 6 – нуль-терминатор, значение трех последних не определено.*/char str3[10]={'H', 'e', 'l', 'l', 'o', '\0'}; //Эквивалентно предыдущему.char str4[10]="Very long line";//Ошибка. Массив из 10 элементов нельзя инициировать более длинной последовательностью.char str5[]="Very long line";/*Компилятор автоматически определяет длину массива (в нашем случае 15) и инициализирует его последовательностью символов. */char* str6; /*Строка - указатель на символ. В большинстве случаев для ее использования потребуется выделить память. Например, так char *s; s = new char[10];*/

Длина строки

Для вычисления длины строки используется функция (заголовочный файл <string.h>):

size_t strlen(const char *string);

Функция возвращает длину строки, не включая нуль-терминатор. Как всегда, следите за тем, чтобы в выделенной памяти все же нашелся такой символ. В противном случае функция выйдет за пределы выделенной памяти и все будет плохо. Напомню, что для определения длины строки функции придется последовательно обратиться ко всем ее символам до нуль-терминатора, а значит, потенциально эта операция довольно дорогая. Поэтому, не следует использовать эту функцию в циклах, то есть, вместо

for (i=0;i<strlen(str);i++) { // работа со строкой, не изменяющая ее длину}

больше подойдет примерно такой код:

char len;len=strlen(str);for (i=0;i<len;i++) { // работа со строкой, не изменяющая ее длину}

 

Упражнение 1. Инициализируйте несколько строк разными способами, определите и напечатайте их размер, используя функцию sizeof() и strlen(). Объясните, чем определяется разница между полученными значениями. Упражнение 2. Проверьте, является ли данная строка палиндромом.

Конкатенация (сцепление) строк

Сначала простой вопрос – каков результат выполнения следующего кода:

char str1[10]="Hello";char str2[10]="World!";char* str3;str3=str1+str2;

Если ответ – ошибка в 4-й строке, вы усвоили материал (или знали это раньше). Если же вы полагаете, что в str3 будет храниться строка "Hello world!", то вероятно, предыдущих объяснений оказалось недостаточно.

Для конкатенации следует использовать функции.

Есть две специальные функции:

char* strcat(char* dest, const char* source)char* strncat(char* dest, const char* source, size_t size)

Эти функции добавляют к строке, на которую указывает dest, символы из строки source. Первая версия добавляет все символы до нуль-терминатора, вторая – максимум size символов. Результирующая строка завершается нуль-терминатором.

Присваивание строк

Первый и самый очевидный способ присваивания строк – присваивание отдельных символов. Например,

str1[0]=’H’;str1[1]=’e’;str1[2]=’l’;str1[3]=’l’;str1[4]=’o’;str1[5]=’\0’;

Это совершенно неудобно, но может сработать при посимвольном вводе элементов строки. К сожалению, массиву нельзя присвоить строку-литерал и следующий код работать не будет:

char str1[10], str2[10];str1="Hello"; str2=str1;

Не будем останавливаться на неправильном или рискованном присваивании строк. Правильное присваивание или копирование строк осуществляется библиотечными функциями, поэтому подключите заголовочный файл <string.h>

Для копирования строк существуют несколько библиотечных функций, наиболее общеупотребительной из которых является функция

char* strcpy(char* dest, const char* src)

Функция посимвольно копирует содержимое строки, на которую указывает src в строку, на которую указывает dest и возвращает dest. Так как массив может быть преобразован в указатель, такой вызов функции абсолютно легален:

char str1[10], str2[10];strcpy(str1, "Hello");strcpy(str2, str1);

При использовании этой функции следует соблюдать осторожность. Опасность заключается в том, что даже если исходная строка окажется больше, чем память, выделенная для второй строки (программистом через new или компилятором при использовании массивов), функция strcpy никак про это узнать не сможет и продолжит копирование в невыделенную память. Разумеется, последствия будут катастрофическими.

Снизить риск такого развития событий способна функция

char* strncpy(char* dest, const char* src, size_t count)

Последний параметр – максимальное количество копируемых символов. Таким образом, передавая туда размер приемника, вы гарантируете, что функция никогда не выйдет за пределы выделенной памяти. Однако помните, что если исходная строка будет скопирована не полностью, нуль-терминатор не появится в результирующей строке. Его придется записать самостоятельно.

Упражнение 3. Из данной строки s создайте строку-палиндром, удвоив и обратив данную строку.

  ПРЕДУПРЕЖДЕНИЕ Никогда не забывайте контролировать используемую память!  
     

Сравнение строк

Для лексикографического сравнения строк используют функцию strcmp. Прототип этой функции:

int strcmp(const char *string1, const char *string2);

Функция возвращает число меньшее 0, если первая строка меньше второй, большее нуля, если первая строка больше второй и 0, если строки лексикографически равны.

Не надо сравнивать строки, используя операции ‘<’ и ‘>’. На самом деле так вы будете сравнивать указатели, то есть адреса строк.

Упражнение 4. Сравнение строк. Составить из двух заданных слов (под словом будем понимать любую последовательность символов, не содержащую в себе пробельных символов) предложение, в котором слова будут упорядочены[1].

Поиск в строке

Для поиска существует довольно большая группа функций, из них рассмотрим strchr (вхождение символа в строку) и strstr (вхождение подстроки в строку)

char * strchr (char * str, int character);

char * strstr (char * str1, const char * str2);

Обе возвращают указатель на первое вхождение искомого в строку, или NULL, если искомое не было найдено.

Упражнение 5. Поиск в строке Проверить, содержит ли строка хотя бы один заданный символ[2]. Проверить, содержит ли строка заданную подстроку[3].

Преобразования строк

Зачастую требуется преобразовать число в строку и наоборот. Есть несколько способов сделать это.

Во-первых, такие преобразования совсем несложно делать самостоятельно. Оставляю это в качестве домашнего задания.

Во-вторых, доступно целое семейство функций atof, atoi, atol и itoa, ltoa. Все они очень похоже между собой. Функции из первой группы преобразуют строку в число (float, int или long) в зависимости от окончания. Функции из второй группы выполняют обратное преобразование.

Прототипы функций из первой группы:

double atof(const char* string);int atoi(const char* string);long atol(const char* string);

Вторая группа:

char* itoa(int value, char* string, int radix);char* ltoa(long value, char* string, int radix);

Функции из второй группы могут создавать строковое представление чисел в любой системе (по любому основанию) от 2 до 36. Основание передается в третьем параметре. Чтобы получить строковое представление числа в десятичной системе, передайте 10. Функции возвращают указатель на строку.

ПРИМЕЧАНИЕ При использовании этих функций не забывайте выделять память, достаточную для предоставления строкового предоставления числа. Например, максимальная длина десятичного строкового представления четырехбайтного беззнакового целого числа - 11 байт, включая нуль-терминатор ("4294967295").

Пример:

char str1[5];char str2[5];char str3[5];itoa(12, str1, 10); //str1=”12”itoa(12, str1, 16); //str1=”C”itoa(12, str1, 2); //str1=”1100”

 

Упражнение 6. Дана строка, содержащая арифметическое выражение вида <число> + <число> =. Требуется вычислить значение суммы.

Заключение

На этом первая часть, посвященная С-строкам заканчивается. В качестве домашнего задания рекомендую изучить примеры приложения и выполнить следующие упражнения.

Упражнение 7. Дана строка, содержащая латинские буквы и десятичные цифры. Получить две строки, одну из букв, другую из цифр данной строки, сохранив относительный порядок символов. Например, из строки “qwer4672ty01” получим “qwerty” и “467201”.

Упражнение 8. На входе две строки: текст поздравления, в котором на месте, где должно стоять имя, находится последовательность символов ##...#, и строка с именем. Требуется создать новую строку, вставив имя вместо последовательности ##...#. Например, из строк “Dear ###! Congratulations!” и “Mary” следует получить “Dear Mary! Congratulations!”

Упражнение 9. Рассмотрите подходы к реализации таких простых действий, как удаление части строки слева и справа. Принципиально это достаточно просто. Для удаления части строки справа достаточно в нужном месте строки поставить символ ‘\0’. Например, в строке “ABCD\0EFGHK” осталась только часть “ABCD”. Чтобы удалить часть строки слева надо перенести указатель на новое начало строки:

char* a = “ABCDEFGHK”;

a += 4;

Теперь в a содержится только “EFGHK”.

Приложение

В Интернете имеется немало ресурсов, описывающих работу со строками. Один из них http://www.cplusplus.com/reference/clibrary/cstring/ понравился мне наличием примеров использования функций.

Копирование

Memcpy

void * memcpy (void * destination, const void * source, size_t num);Copy block of memoryCopies the values of num bytes from the location pointed by source directly to the memory block pointed by destination.

Example

1 2 3 4 5 6 7 8 9 10 11 12 13 14 /* memcpy example */ #include <stdio.h> #include <string.h>   int main () { char str1[]="Sample string"; char str2[40]; char str3[40]; memcpy (str2,str1,strlen(str1)+1); memcpy (str3,"copy successful",16); printf ("str1: %s\nstr2: %s\nstr3: %s\n",str1,str2,str3); return 0; }

Output:

str1: Sample stringstr2: Sample stringstr3: copy successful

Memmove

void * memmove (void * destination, const void * source, size_t num);Move block of memoryCopies the values of num bytes from the location pointed by source to the memory block pointed by destination. Copying takes place as if an intermediate buffer were used, allowing the destination and source to overlap.

Example

1 2 3 4 5 6 7 8 9 10 11 /* memmove example */ #include <stdio.h> #include <string.h>   int main () { char str[] = "memmove can be very useful......"; memmove (str+20,str+15,11); puts (str); return 0; }

Output:

memmove can be very very useful.

Strcpy

char * strcpy (char * destination, const char * source);

Copy string

Copies the C string pointed by source into the array pointed by destination, including the terminating null character.

Example

1 2 3 4 5 6 7 8 9 10 11 12 13 14 /* strcpy example */ #include <stdio.h> #include <string.h>   int main () { char str1[]="Sample string"; char str2[40]; char str3[40]; strcpy (str2,str1); strcpy (str3,"copy successful"); printf ("str1: %s\nstr2: %s\nstr3: %s\n",str1,str2,str3); return 0; }

Output:

str1: Sample stringstr2: Sample stringstr3: copy successful

Strncpy

char * strncpy (char * destination, const char * source, size_t num);

Copy characters from string

Copies the first num characters of source to destination. If the end of the source C string (which is signaled by a null-character) is found before num characters have been copied, destination is padded with zeros until a total of num characters have been written to it.

Example

1 2 3 4 5 6 7 8 9 10 11 12 13 /* strncpy example */ #include <stdio.h> #include <string.h>   int main () { char str1[]= "To be or not to be"; char str2[6]; strncpy (str2,str1,5); str2[5]='\0'; puts (str2); return 0; }

Output:

To be

Конкатенация

Strcat

char * strcat (char * destination, const char * source);

Concatenate strings

Appends a copy of the source string to the destination string. The terminating null character in destination is overwritten by the first character of source, and a new null-character is appended at the end of the new string formed by the concatenation of both in destination.

Example

1 2 3 4 5 6 7 8 9 10 11 12 13 14 /* strcat example */ #include <stdio.h> #include <string.h>   int main () { char str[80]; strcpy (str,"these "); strcat (str,"strings "); strcat (str,"are "); strcat (str,"concatenated."); puts (str); return 0; }

Output:

these strings are concatenated.

 

Strncat

char * strncat (char * destination, char * source, size_t num);

Append characters from string

Appends the first num characters of source to destination, plus a terminating null-character. If the length of the C string in source is less than num, only the content up to the terminating null-character is copied.

Example

1 2 3 4 5 6 7 8 9 10 11 12 13 14 /* strncat example */ #include <stdio.h> #include <string.h>   int main () { char str1[20]; char str2[20]; strcpy (str1,"To be "); strcpy (str2,"or not to be"); strncat (str1, str2, 6); puts (str1); return 0; }

Output:

To be or not

Сравнение

Memcmp

int memcmp (const void * ptr1, const void * ptr2, size_t num);

Compare two blocks of memory

Compares the first num bytes of the block of memory pointed by ptr1 to the first num bytes pointed by ptr2, returning zero if they all match or a value different from zero representing which is greater if they do not

Example

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 /* memcmp example */ #include <stdio.h> #include <string.h>   int main () { char str1[256]; char str2[256]; int n; printf ("Enter a sentence: "); gets(str1); printf ("Enter another sentence: "); gets(str2); n=memcmp (str1, str2, 256); if (n>0) printf ("'%s' is greater than '%s'.\n",str1,str2); else if (n<0) printf ("'%s' is less than '%s'.\n",str1,str2); else printf ("'%s' is the same as '%s'.\n",str1,str2); return 0; }

Output:

Enter a sentence: buildingEnter another sentence: book'building' is greater than 'book'.

Strcmp

int strcmp (const char * str1, const char * str2);

Compare two strings

Compares the C string str1 to the C string str2.
This function starts comparing the first character of each string. If they are equal to each other, it continues with the following pairs until the characters differ or until a terminating null-character is reached.

Example

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 /* strcmp example */ #include <stdio.h> #include <string.h>   int main () { char szKey[] = "apple"; char szInput[80]; do { printf ("Guess my favourite fruit? "); gets (szInput); } while (strcmp (szKey,szInput)!= 0); puts ("Correct answer!"); return 0; }

Output:

Guess my favourite fruit? orangeGuess my favourite fruit? appleCorrect answer!

Strcoll

int strcoll (const char * str1, const char * str2);

Compare two strings using locale

Compares the C string str1 to the C string str2, both interpreted appropiately according to the LC_COLLATE category of the current locale.

This function starts comparing the first character of each string. If they are equal to each other continues with the following pair until the characters differ or until a null-character signaling the end of a string is reached.

Strncmp

int strncmp (const char * str1, const char * str2, size_t num);

Compare characters of two strings

Compares up to num characters of the C string str1 to those of the C string str2.
This function starts comparing the first character of each string. If they are equal to each other, it continues with the following pairs until the characters differ, until a terminating null-character is reached, or until num characters match in both strings, whichever happens first.

Example

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 /* strncmp example */ #include <stdio.h> #include <string.h>   int main () { char str[][5] = { "R2D2", "C3PO", "R2A6" }; int n; puts ("Looking for R2 astromech droids..."); for (n=0; n<3; n++) if (strncmp (str[n],"R2xx",2) == 0) { printf ("found %s\n",str[n]); } return 0; }

Output:

Looking for R2 astromech droids...found R2D2found R2A6

Strxfrm

size_t strxfrm (char * destination, const char * source, size_t num);

Transform string using locale

Transforms the C string pointed by source according to the current locale and copies the first num characters of the transformed string to destination, returning its length.

Alternativelly, the function can be used to only retrieve the length, by specifying a null pointer for destination and zero for num.

Поиск

Memchr

const void * memchr (const void * ptr, int value, size_t num);

void * memchr (  void * ptr, int value, size_t num);

Locate character in block of memory

Searches within the first num bytes of the block of memory pointed by ptr for the first occurrence of value (interpreted as an unsigned char), and returns a pointer to it.

Example

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 /* memchr example */ #include <stdio.h> #include <string.h>   int main () { char * pch; char str[] = "Example string"; pch = (char*) memchr (str, 'p', strlen(str)); if (pch!=NULL) printf ("'p' found at position %d.\n", pch-str+1); else printf ("'p' not found.\n"); return 0; }

Output:

'p' found at position 5.

Strchr

const char * strchr (const char * str, int character);

char * strchr (    char * str, int character);

Locate first occurrence of character in string

Returns a pointer to the first occurrence of character in the C string str.

Example

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 /* strchr example */ #include <stdio.h> #include <string.h>   int main () { char str[] = "This is a sample string"; char * pch; printf ("Looking for the 's' character in \"%s\"...\n",str); pch=strchr(str,'s'); while (pch!=NULL) { printf ("found at %d\n",pch-str+1); pch=strchr(pch+1,'s'); } return 0; }

Output:

Looking for the 's' character in "This is a sample string"...found at 4found at 7found at 11found at 18

Strcspn

size_t strcspn (const char * str1, const char * str2);

Get span until character in string

Scans str1 for the first occurrence of any of the characters that are part of str2, returning the number of characters of str1 read before this first occurrence.

Example

1 2 3 4 5 6 7 8 9 10 11 12 13 /* strcspn example */ #include <stdio.h> #include <string.h>   int main () { char str[] = "fcba73"; char keys[] = "1234567890"; int i; i = strcspn (str,keys); printf ("The first number in str is at position %d.\n",i+1); return 0; }

Output:

The first number in str is at position 5

Strpbrk

const char * strpbrk (const char * str1, const char * str2);

char * strpbrk (  char * str1, const char * str2);

Locate character in string

Returns a pointer to the first occurrence in str1 of any of the characters that are part of str2, or a null pointer if there are no matches.

Example

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 /* strpbrk example */ #include <stdio.h> #include <string.h>   int main () { char str[] = "This is a sample string"; char key[] = "aeiou"; char * pch; printf ("Vowels in '%s': ",str); pch = strpbrk (str, key); while (pch!= NULL) { printf ("%c ", *pch); pch = strpbrk (pch+1,key); } printf ("\n"); return 0; }

Output:

Vowels in 'This is a sample string': i i a a e i

Strrchr

const char * strrchr (const char * str, int character);

  char * strrchr (  char * str, int character);

Locate last occurrence of character in string

Returns a pointer to the last occurrence of character in the C string str.

Example

1 2 3 4 5 6 7 8 9 10 11 12 /* strrchr example */ #include <stdio.h> #include <string.h>   int main () { char str[] = "This is a sample string"; char * pch; pch=strrchr(str,'s'); printf ("Last occurence of 's' found at %d \n",pch-str+1); return 0; }

Output:

Last occurrence of 's' found at 18

Strspn

size_t strspn (const char * str1, const char * str2);

Get span of character set in string

Returns the length of the initial portion of str1 which consists only of characters that are part of str2.

Example

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 /* strspn example */ #include <stdio.h> #include <string.h>   int main () { int i; char strtext[] = "129th"; char cset[] = "1234567890";   i = strspn (strtext,cset); printf ("The length of initial number is %d.\n",i); return 0; }

Output:

The length of initial number is 3.

Strstr

const char * strstr (const char * str1, const char * str2);

char * strstr (  char * str1, const char * str2);

Locate substring

Returns a pointer to the first occurrence of str2 in str1, or a null pointer if str2 is not part of str1.

Example

1 2 3 4 5 6 7 8 9 10 11 12 13 /* strstr example */ #include <stdio.h> #include <string.h>   int main () { char str[] ="This is a simple string"; char * pch; pch = strstr (str,"simple"); strncpy (pch,"sample",6); puts (str); return 0; }

This example searches for the "simple" substring in str and replaces that word for "sample".
Output:

This is a sample string

Strtok

char * strtok (char * str, const char * delimiters);

Split string into tokens

A sequence of calls to this function split str into tokens, which are sequences of contiguous characters separated by any of the characters that are part of delimiters.

On a first call, the function expects a C string as argument for str, whose first character is used as the starting location to scan for tokens. In subsequent calls, the function expects a null pointer and uses the position right after the end of last token as the new starting location for scanning.

To determine the beginning and the end of a token, the function first scans from the starting location for the first character not contained in delimiters (which becomes the beginning of the token). And then scans starting from this beginning of the token for the first character contained in delimiters, which becomes the end of the token.

This end of the token is automatically replaced by a null-character by the function, and the beginning of the token is returned by the function.

Once the terminating null character of str has been found in a call to strtok, all subsequent calls to this function with a null pointer as the first argument return a null pointer.

Example

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 /* strtok example */ #include <stdio.h> #include <string.h>   int main () { char str[] ="- This, a sample string."; char * pch; printf ("Splitting string \"%s\" into tokens:\n",str); pch = strtok (str,",.-"); while (pch!= NULL) { printf ("%s\n",pch); pch = strtok (NULL, ",.-"); } return 0; }

Output:

Splitting string "- This, a sample string." into tokens:Thisasamplestring

Разное

Memset

void * memset (void * ptr, int value, size_t num);

Fill block of memory

Sets the first num bytes of the block of memory pointed by ptr to the specified value (interpreted as an unsigned char).

Example

1 2 3 4 5 6 7 8 9 10 11 /* memset example */ #include <stdio.h> #include <string.h>   int main () { char str[] = "almost every programmer should know memset!"; memset (str,'-',6); puts (str); return 0; }

Output:

------ every programmer should know memset!

 

Strerror

char * strerror (int errnum);

Get pointer to error message string

Interprets the value of errnum generating a string describing the error that usually generates that error number value in calls to functions of the C library.

Example

1 2 3 4 5 6 7 8 9 10 11 12 13 /* strerror example: error list */ #include <stdio.h> #include <string.h> #include <errno.h>   int main () { FILE * pFile; pFile = fopen ("unexist.ent","r"); if (pFile == NULL) printf ("Error opening file unexist.ent: %s\n",strerror(errno)); return 0; }

A possible output:

  Error opening file unexist.ent: No such file or directory

Strlen

size_t strlen (const char * str);

Get string length

Returns the length of str.

Example

1 2 3 4 5 6 7 8 9 10 11 12 /* strlen example */ #include <stdio.h> #include <string.h>   int main () { char szInput[256]; printf ("Enter a sentence: "); gets (szInput); printf ("The sentence entered is %u characters long.\n",(unsigned)strlen(szInput)); return 0; }

Output:

Enter sentence: just testingThe sentence entered is 12 characters long.

NULL

Null pointer

This macro expands to a null pointer constant.

A null pointer is generally used to signify that a pointer does not point to any object.

In C++, NULL expands either to 0 or 0L.

Size_t

Unsigned integral type

size_t corresponds to the integral data type returned by the language operator sizeof and is defined in the <cstring> header file (among others) as an unsigned integral type.

In <cstring>, it is used as the type of the parameter num in the functions memchr, memcmp, memcpy, memmove, memset, strncat, strncmp, strncpy and strxfrm, which in all cases it is used to specify the maximum number of bytes or characters the function has to affect.

It is also used as the return type for strcspn, strlen, strspn and strxfrm to return sizes and lengths.

 


[1] char *p = "Troop";

char *q = "army";

char *s; s=new char[strlen(p)+strlen(q)+2];

if (strcmp(p, q) > 0)

{

strcpy(s,q);

strcat(s," ");

strcat(s,p);

}

else

{

strcpy(s,p);

strcat(s," ");

strcat(s,q);

}

[2] char *p = "Dear ###! Congratulations!";

char c = '.';

int t= (strchr(p,c))? 1: 0;

[3] strstr(p,sub)



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: