Strcpy(), strcat(), strlen(), strcmp()

Вызов функции strcpy() имеет вид strcpy(s1,s2).Содержимое строкиs2копируется встрокуs1.

Вызов функции strcat() имеет вид strcat(s1,s2).Функция strcat() присоединяет строку s2к строке s1 и помещает ее в массив, где находится строка s1, при этом строка s2 не изменяется. Нулевой байт, который завершал строку s1, будет заменен первым символом строки s2.

Пример использования данных функций

#include <stdio.h>

#include <string.h>

Void main(void)

{

char s1[20],s2[20];

strcpy(s1,”Hello, “);

strcpy(s2,”World!”);

Puts(s1);

Puts(s2);

Strcat(s1,s2);

Puts(s1);

Puts(s2);

}

Вызов функции strcmp() имеет вид strcmp(s1,s2).Функция strcmp() сравнивает строки s1 и s2и возвращает значение 0, если строки равны, то есть содержат одно и то же число одинаковых символов. Сравнение в лексикографическом смысле. Если s1 лексикографически (в смысле словаря) больше s2, то функция возвращает положительное значение, если меньше, то отрицательное значение.

Вызов функции strlen() имеет вид strlen(s).Функция возвращает длину строки s, при этом завершающий нулевой байт не учитывается.

Пример

#include <stdio.h>

#include <string.h>

Void main(void)

{

char s[80];

printf(”Введите строку: “);

Gets(s);

printf(“Строка \n %s \n имеет длину %d символов \n”,s,strlen(s));

}

Функции из стандартной библиотеки для работы со строками

  1. char *strcat(char *dest, char *source) – конкатенация строк destи source.
  2. char *strncat(char *dest, char *source, unsigned maxlen) – присоединяет maxlenсимволов строки source к строке dest.
  3. char *strchr(char *source, char ch) – поиск в строке source первого вхождения символа ch.
  4. int strcmp(char *s1, char *s2) – возвращает 0, если s1 = = s2, возвращает <0, если s1<s2, и возвращает >0, если s1>s2.
  5. int strncmp(char *s1, char *s2, int maxlen) – возвращает 0, если s1 = = s2, возвращает <0, если s1<s2, и возвращает >0, если s1>s2.Сравниваются только первые maxlenсимволов.
  6. int stricmp(char *s1, char *s2) – возвращает 0, если s1 = = s2, возвращает <0, если s1<s2, и возвращает >0, если s1>s2.Не проверяются регистры букв.
  7. int strnicmp(char *s1, char *s2, int maxlen) – возвращает 0, если s1 = = s2, возвращает <0, если s1<s2, и возвращает >0, если s1>s2.Сравниваются только первые maxlenсимволов. Не проверяются регистры букв.
  8. char *strcpy(char *dest, char *source) – копирование строки sourceв строкуdest.
  9. char *strncpy(char *dest, char *source, unsigned maxlen) – копирование maxlenсимволов строки sourceв строкуdest.
  10. int strlen(char *s) –выдает число символов в строке без учета нулевого символа конца строки.
  11. char *strlwr(char *s)– переводит всю строку в нижний регистр (в строчные буквы)
  12. char *strupr(char *s)– переводит всю строку в верхний регистр (в прописные буквы)
  13. char *strdum(char *s) –вызывает функцию malloc и отводит место под копию s.
  14. char *strset(char *s, char ch) – заполняет всю строку символами ch.
  15. char *strnset(char *s, char ch, unsigned n) – заполняет первые nпозиций строки sсимволами ch.
  16. char *strrev(char *s)– инвертирует все буквы в строке s.
  17. int strcspn(char *s1, char *s2) –возвращает длину начального сегмента строкиs1,которая состоит исключительно из символов, не содержащихся в строкеs2.
  18. char *strpbrk(char *s1, char *s2) –просмотр строкиs1до тех пор, пока в ней не встретится символ, содержащийся вs2
  19. char *strrchr(char *s, char ch) – просматривает строку s до последнего появления в ней символа ch.
  20. int strspn(char *s1, char *s2) –возвращает длину начального сегмента строкиs1,который состоит исключительно из символов из строкиs2
  21. char *strstr(char *s1, char *s2) –возвращает указатель на позицию вхождения строкиs2в строкуs1.Если вхождения нет, то значение указателяNULL.
  22. char *strtok(char *s1, char *s2) – предполагается что строка s1 состоит из фрагментов, разделенных одно- или многосимвольными разделителями из строки s2. При первом обращении к strtok выдается указатель на первый символ первого фрагмента строки s1. последующие вызовы с заданием нуля вместо первого аргумента будут выдавать адреса дальнейших фрагментов из строки s1 до тех пор, пока фрагментов не останется.

 

Двумерные массивы

Язык С допускает многомерные массивы, простейшей формой которых является двумерный массив

(two-dimensional array). Двумерный массив a[3][4] можно представить в виде таблицы

A[0][0] A[0][1] A[0][2] A[0][3]
A[1][0] A[1][1] A[1][2] A[1][3]
A[2][0] A[2][1] A[2][2] A[2][3]

Количество байт = <размер типа данных>*<количество строк>*<количество столбцов>

Следует помнить, что память для всех массивов, которые определены как глобальные, отводится в процессе компиляции и сохраняется все время, пока работает программа.

Часто двумерные массивы используются для работы с таблицами, содержащими текстовую информацию. Очень часто используются массивы строк. Пример:

#include <stdio.h>

#include <string.h>

Void main(void)

{

char text[5][20];

strcpy(text[0],”Turbo Basic”);

strcpy(text[1],”Turbo Pascal”);

strcpy(text[2],”Borland C++”);

strcpy(text[3],”Turbo Prolog”);

strcpy(text[4],”Visual C++”);

}

T u r b o   B a s i c \0                
T u r b o   P a s c a l \0              
B o r l a n d   C + + \0                
T u r b o   P r o l o g \0              
V i s u a l   C + + \0                  

 

Инициализация массивов

В С имеется возможность инициализации данных, то есть присваивание начальных значений. Самый простой: в процессе объявления массива можно указать в фигурных скобках список инициализаторов. Например:

float farr[6]={1.1,2.2,3.4,4.0.-5.5};

int a[3][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

Инициализации

int a[3][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};и int a[3][5]={1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15};

эквивалентны.

Количество инициализаторов не обязательно совпадает с количеством элементов массива. Например, различные инициализации одного и того же массива.

int a[3][5]={1,2,3,4,5,6,7,8,9,10,11};иint a[3][5]={1,2,3},{4,5,6,7,8},{9,10,11};

Соответствующие массивы будут заполнены следующим образом

В первом случае

       

Во втором случае

   
   

Символьные массивы могут инициализироваться как обычный массив или как строка символов. Например:

char str[15]={‘B’,’o’,’r’,’l’,’a’,’n’,’d’,’ ‘,’C’,’+’,’+’};илиchar str[15]=”Borland C++”;

Допускается объявление и инициализация массива без явного указания размера массива.

Примеры:

char str[]=”Это объявление и инициализация массива символов”;

int mass[]={1,2,3,4,5,6};

int arr[][3]={1, 2, 3,

5, 6, 7,

8, 9, 0};

Пример сортировки элементов массива

#include <stdio.h>

Void main(void)

{

int arr[10]={1, 23, 4, 7, 8, 0, 1, 9, 4, 7};

Int i,j,tmp;

printf(“Неотсортированный массив:”);

for(i=0;i<10;i++)

printf(“%d “,arr[i]);

printf(“\n”);

for(i=0;i<9;i++)

{

for(j=i+1;j<10;j++)

{

if (a[i]>a[j])

{

tmp=a[i];

a[i]=a[j];

a[j]=tmp;

}

}

}

printf(“Oтсортированный массив:”);

for(i=0;i<10;i++)

printf(“%d “,arr[i]);

printf(“\n”);

}

Указатели

Важная конструкция в С, С++ - это указатели. Они необходимы для успешного использования функций и динамического распределения памяти. Кроме того многие конструкции языка С, С++, Visual C++требуют применения указателей.

Объявление указателей.

Указатель – это переменная, которая содержит адрес некоторого объекта (адрес памяти, целое число). Указатель объявляется следующим образом:

тип *<имя переменной>;

В этом объявлении тип – некоторый тип языка С, определяющий тип объекта, на который указывает указатель (адрес которого содержит). Символ * означает, что следующая за ним переменная является указателем. Пример:

char *ch;

int *temp,i,j;

float *pf,f;

Операции над указателями

С указателями связаны две специальные операции & и *. Обе операции являются унарными (один операнд) и обладают наивысшим приоритетом.

Операция & соответствует операции “взять адрес”.

Операция * соответствует операции “взять значение по указанному адресу”.

Простейшие действия с указателями иллюстрируются следующей программой:

#include <stdio.h>

Void main(void)

{

float x=10.1,y;

float *pf;

pf=&x;

y=*pf;

printf(“x=%f y=%f”, x ,y );

*pf++;

printf(“x=%f y=%f”, x ,y );

y=1+*pf*y;

printf(“x=%f y=%f”, x ,y );

}

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

#include <stdio.h>

Void main(void)

{

int x=10;

int *p, *g;

p=&x;

g=p;

printf(“%p”,p); /* печать содержимого p */

printf(“%p”,g); /* печать содержимого g */

printf(“%d %d”,x, g); /* печать величины х и величины по адресу g */

}

В С допустимо присвоить указателю любой адрес памяти. Однако, если объявлен указатель на целое int *pi,а по адресу, который присвоен данному указателю, находится переменная типа float, то при компиляции программы будет выдано сообщение об ошибке в строке p=&x;Эту ошибку можно исправить, преобразовав указатель на int к указателю на float явным преобразованием типа:p=(int*)&x;Но при этом теряется информация о том, на какой тип указывает исходный указатель.Как и над другими типами переменных, над указателями можно производить арифметические операции: сложение и вычитание (операции ++ и – являются частными случаями операций сложения и вычитания). Пример:

#include <stdio.h>

Void main(void)

{

int *p;

Int x;

p=&x;

printf(“%p %p”, p, ++p);

}

После выполнения этой программы при выполнении операции ++pзначение указателя увеличивается на 2 (указание на адрес следующего целого, т. е. учитывается базовый тип указателя). Операции над указателями не ограничиваются только операциями ++ и --. К указателям можно прибавлять и из них можно вычитать целые числа. Общая формула для вычисления значения указателя после выполнения операции p=p+n; будет иметь вид <p>=<p>+n*<количество байт памяти базового указателя типа>

Указатели можно сравнивать. Применимы все 6 операций: <,>,<=,>=,==,!=.