Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Массивы строк




Функция strcmp()

Функции strcat() и strncat()

Функции strcpy() и strncpy()

Функция strlen()

Эта функция предназначена для определения длины строки. Ее прототип имеет следующий вид:

#include<string.h>

size_t strlen(const char * str);

Тип size_t является разновидностью целочисленного типа. Функция strlen() возвращает длину строки, на которую установлен указатель str, причем строка должна заканчиваться “нуль – символом”. “Нуль – символ” во время определения длины строки не учитывается. Пример применения функции strlen().

#include<stdio.h>
#include<conio.h>
#include<string.h>

int main(void)
{
clrscr();
char str[81];
printf(“Введите строку:”);
gets(str);
printf(“Длина введенной строки =%d”, strlen(str));
getch();
return 0;
}

Протокол работы с программой имеет следующий вид.
Введите строку: Это строка

Длина введенной строки=10

 

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

 

/* Программный код, содержащий ошибку */

char str1[30] = “Hello”;

char str2[30];
str2 = str1; /* Недопустимый код, т.к. str2 – константный
указатель */

Для копирования строк в языке Си следует использовать библиотечные функции strcpy() и strncpy(). Обращает на себя похожесть имен этих функций. В соответствии с принципом образования имен, принятым в библиотеке string это означает, что функция strncpy() имеет дополнительный параметр n.

Объявления функций strcpy() и strncpy() имеют следующий вид:

#include<string.h>
char * strcpy(char * out_str, const char * in_str);
char * strncpy(char * out_str, const char * in_str, size_t n);

Обе функции (strcpy() и strncpy) копируют содержимое строки in_str в строку out_str. Параметр in_str должен указывать на строку, которая заканчивается нуль - символом. До вызова рассматриваемых функций необходимо выделить память для хранения новой строки. Функции strcpy() и strncpy() эту память не выделяют. Обе функции возвращают значение указателя out_str. Обе функции заканчивают копирование в том случае, когда в строке str_in встречается нуль – символ. Функция strncpy() выполняет копирование более осторожным образом. Это связано с наличием у этой функции третьего параметра (параметр n), который ограничивает количество копируемых символов. Количество символов, которые могут быть скопированы функцией strncpy() не может быть больше n. Заметим, что в предельном случае, когда в скопированных n символах строки in_str не встретился нуль \ символ, то выходная строка не будет заканчиваться нуль – символом. Если массивы in_str и out_str перекрываются поведение функции strcpy() не определено.

В следующем фрагменте кода строка Hello копируется в строку str.

char str[81];
strcpy(str, "Hello");

Типичной ошибкой при работе с функцией strcpy() является передача ей неправильного указателя на строку str_in. Например, некорректным оказывается следующий фрагмент кода:

void foo()

{

char str1[25] = “Hello”;

char * str2;

strcpy(str1, str2);

/* другой код */

}

Ошибка в приведенном выше коде состоит в отсутствии инициализации указателя str2.

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

Объявления рассматриваемых функций имеют следующий вид:

#include<string.h>
char * strcat(char * out_str, const char * in_str);
char * strncat(char * out_str, const char * in_str,
size_t n);

 

Функция strcat() присоединяет содержимое строки in_str к строке out_str. Параметр in_str должен указывать на строку, которая заканчивается нуль - символом. Конечный “нуль – символ”, первоначально завершающий строку out_str, перезаписывается первым символом строки in_str. Функция strcat() возвращает значение указателя out_str. Если массивы in_str и out_str перекрываются поведение функции strcat() не определено.

В следующей программе две строки читаются с клавиатуры, затем объединенная строка выводится на экран дисплея.

#include<stdio.h>
#include<string.h>

int main(void)
{
char buf1[64], buf2[64];
gets(buf1);
gets(buf2);
strcat(buf1, buf2);
printf(buf1);
return 0;
}

Перейдем к рассмотрению функции strncat(). Эта функция присоединяет не более n символов строки in_str в конец строки out_str. Если “нуль – символ” строки in_str достигнут раньше, чем будут прочитаны n символов строки in_str, то этот символ копируется, и процесс присоединения заканчивается. Если среди скопированных n символов не встретился нуль – символ, то он добавляется в строку in_str и процесс присоединения на этом заканчивается. В этом случае в выходную строку записывается n + 1 символ. Если в вызове функции n или отрицательно, то функция не изменяет выходную строку out_str.

Объявление этой функции имеет следующий вид

#include<string.h>
int strcmp(const char * in_str1, const char * in_str2);

 

Функция strcmp() выполняет так называемое лексографическое сравнение строк. Функция возвращает нулевое значение, если строки совпадают. Функция возвращает положительное значение, если строка in_str1 > in_str2. Наконец, функция возвращает отрицательное значение, если in_str1 < in_str2. Строка in_str1 считается больше строки in_str2, если первый несовпадающий ее символ имеет код, превышающий код соответствующего ему символа строки in_str2.

Ниже приводится пример применения функции strcmp().

#include<stdio.h>
#include<string.h>

int main(void)
{
char name[32] = "Tom";
/* Выводится положительное число */
printf("%d\n", strcmp(name, "Alic"); /*

/* Выводится отрицательное число */
printf("%d\n", strcmp(name, "Victor");

/* Выводится нуль */
printf("%d\n", strcmp(name, "Tom");
return 0;
}

 

Ограничимся рассмотрением массива строк, построенного на основе двумерного символьного массива с фиксированными размерами. Правила работы с массивом строк рассмотрим на простом примере.

Постановка задачи. Необходимо ввести с клавиатуры “n” строк(n <= 20), длина которых не превышает 80 символов. Вводимые строки записать в строковый массив. После завершения ввода выполнить вывод строк, сохраненных в массиве. Ввод и вывод организовать с помощью функций пользователя.




Поделиться с друзьями:


Дата добавления: 2014-01-06; Просмотров: 345; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.011 сек.