Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metod_ukazanija C_1-8.docx
Скачиваний:
12
Добавлен:
20.04.2015
Размер:
378.52 Кб
Скачать

Контрольные вопросы по теме № 5

  1. Какого типа могут быть индексы массивов?

  2. Что такое размерность массивов?

  3. Для чего нужен «барьер» в сортировке методом прямого включения?

  4. Каков алгоритм поиска минимума или максимума в одномерном массиве?

  5. Как найти индекс элемента в одномерном массиве по его значению?

  6. Алгоритм поиска минимума или максимума в двумерном массиве.

  7. Назначение функций random и randomize?

  8. Сортировка элементов двумерного массива.

  9. Как обратиться к элементу массива по указателю?

Тема №6. Строки и использование библиотечных функций для их обработки

Задание: Введите с клавиатуры предложение, выделите из предложения отдельные слова в массив слов, проведите преобразование предложения и слов в соответствии с индивидуальным заданием, распечатайте результат обработки на экран монитора. Используйте как можно больше библиотечных функций для работы со строками.

Индивидуальные задания на лабораторную работу даны в конце описания к теме № 6. Длина вводимого предложения не более 80 символов (ширина экрана). При выполнении задания необходимо во всех случаях, где это можно, использовать функции для работы со строками. Все задания подразумевают необходимость применения не менее трех разных функций.

Краткая теоретическая справка и рекомендации по выполнению

Строка в языке Си представляет собой одномерный массив символов, последним элементом которой является символ конца строки – нуль (строка, завершающаяся нулем, то есть NULLterminatedstring).

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

char s[40+1];

Второй способ предусматривает присваивание строковой переменной начального значения (при этом длину строки компилятор может вычислить сам):

char s[] = "Пример инициализации строки";

Справа от знака присваивания записана строковая константа. В конце строки автоматически добавляется ноль ('\0'). Константы символьных строк помещаются в класс статической памяти.

В третьем способе явно не указывается, что используется массив. В левой части от знака присваивания указывается указатель на символ:

char *s="Второй вариант инициализации";

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

char *s;

Для работы со строками есть набор функций. Для ввода со стандартного устройства ввода (клавиатуры) чаще всего используются библиотечные функциями из модуля стандартного ввода-вывода: scanfиgets.

Для ввода строки с помощью функции scanf, использует формат «%s», причем обратите внимание на то, что перед идентификатором строки не используется знак адреса «&», так как одномерный массив уже представлен указателем на его начало:

scanf("%s", s);

Функция gets() считывает символы до тех пор, пока не достигнет символа перехода на новую строку. Функция принимает все символы вплоть до символа перевода строки, но не включает его. К концу строки добавляется завершающий ноль ('\0'). Функция gets() помещает считанную с клавиатуры последовательность символов в параметр типа строка и возвращает указатель на эту строку (если операция завершилась успешно), или NULL(в случае ошибки). В приведенном ниже примере при успешном завершении операции, на экран будет выведено две одинаковые строки:

#include <stdio.h>

int main()

{ char s[50];

char *p;

p=gets(s);

printf(" \n Введена строка %s. ",s);

if (p) printf(" \n Введена строка %s. ",p);

return 0;

}

Попутно заметим, что функция gets часто используется для ввода любых данных с клавиатуры в виде строки с целью дальнейшего преобразования функцией sscanfк нужному формату или для предварительного анализа вводимых данных, например:

#include <string.h>

#include <stdio.h>

#include <conio.h>

int main()

{ char s[50]; int x, err;

do

{ printf(" \n Введите целое число -> ");

gets(s);

err=sscanf(s, "%d",&x);

if (err!=1) printf(" \n Ошибка ввода. ");

} while (err!=1);

printf("\n Введено целое число -> %d", x);

return 0;

}

Для вывода строк на стандартное устройство вывода (экран монитора) можно использовать две функции printfиputs. В функцииprintfв качестве формата передается "%s". Удобство использования этой функции заключается в том, что помимо строки можно сразу выводит данные других типов. Особенность функцииputsзаключается в том, что после вывода строки автоматически происходит переход на следующую строку.

Для преобразования строк в языке Си предусмотрена библиотека string. Каждая из функций имеет свой формат записи (прототип). Некоторые из функций представлены ниже. Более подробное описание функций смотрите в указанных библиографических источниках.

void*strcat(char*s1,constchar*s2) – дополняет строкуs1 строкойs2.

char*strncat(char*s1,constchar*s2,size_tn) – дополняет строкуs1 символами из строкиs2, но не более чемnштук.

char *strcpy(char *s1,const char *s2) – копирует строку, указанную указателем s2, на место, указанное указателем s1; возвращает s1.

char *stpcpy(char *dest, const char *src) – копирует строку, указанную указателем src, на место, указанное указателемdest; не копирует символ конца строки;

char *strncpy(char *s1, const char *s2, size_t n) – – копирует строку, указанную указателем s2, на место, указанное указателем s1; возвращает s1; копируется не более чем n символов.

int strcmp(const char *s1,const char *s2) – сравнивает строки, указанные указателями s1 и s2; символы строк сравнивают с помощью значений их кодов; функция возвращает 0, если строки одинаковы; значение, которое меньше 0, если первая строка меньше второй; и значение, превышающее 0, если первая строка больше второй.

int strncmp(const char *s1,const char *s2, size_t n ) – сравнивает первые n символов или до первого пустого символа строки, указанные указателями s1 и s2.

int stricmp(const char *s1,const char *s2) – сравнивает строки, указанные указателями s1 и s2, игнорируя регистр символов (строчные или заглавные);

int strcmpi(const char *s1,const char *s2) – сравнивает строки, указанные указателями s1 и s2, игнорируя регистр символов (строчные или заглавные);

chat *strchr(const chat *s, int c) – ищет первое появление c (преобразованного в char) в строке, указанной указателем s; пустой символ является частью строки; возвращает указатель на первое появление или NULL, если ничего не найдено.

chat *strrchr(const chat *s, int c) – ищет последнее появление символа c в строке, то есть поиск идет с конца строки, заданной указателем s; пустой символ является частью строки; возвращает указатель на первое появление или NULL, если ничего не найдено.

char *strstr(const chat *s1, const char *s2) – возвращает указатель на положение первого появления последовательности символов из s2 в строке s1 (исключая завершающие пробелы); возвращает NULL, если совпадений не найдено.

chat *strtok(chat *s1,const chat *s2) – эта функция переформирует строку s1 в отдельные знаки; строка s2 содержит символы, которые используются в качестве разделителей. Функция вызывается последовательно. Для первого вызова s1 должен указывать на строку, которую необходимо разбить на знаки. Функция находит разделитель, который следует за символом, не являющимся разделителем, и заменяет, его пробелом. Она возвращает указатель на строку, содержащую первый знак. Если ни оного знака не найдено, она возвращает NULL. Чтобы найти следующий знак в строке, необходимо вызвать функцию опять, но первым аргументом поставить NULL. Каждый последовательный вызов возвращает указатель на следующий знак или на NULL, если больше знаков не найдено.

int strlen(const char *s) – возвращает число символов (исключая завершающие пробелы) в строке s.

void setmem(void *dest, unsigned length, char value) – присваивает значение valueдиапазону памяти, начиная с адресаdest;

size_t strspn(const char *s1, const char *s2) – находит начальный сегмент строки s1, которая состоит из символов строкиs2; возвращает длину найденного сегмента.

size_t strсspn(const char *s1, const char *s2) – находит начальный сегмент строки s1, которая не состоит из символов строкиs2; возвращает длину найденного сегмента.

char*strdup(const char s)резервирует оперативную память и помещает на это место копию строкиs; возвращает указатель на зарезервированную область памяти.

char *strlwr(char *s) – преобразует все символы строки к нижнему регистру (от a до z); возвращает указатель на строку s.

char *strupr(char *s) – преобразует все символы строки к верхнему регистру (от A до Z); возвращает указатель на строкуs.

char *strpbrk(const char *s1, const char *s2) – сканирует строку s1 на присутствие любого символа строкиs2; возвращает указатель на найденный символ илиNULL, если совпадение не найдено.

char *strrev(char *s) – переписывает символы в строке в обратной последовательности; возвращает указатель на строку s.

char *strset(char *s, int ch) – все символы в строке делает равными ch; возвращает указатель на строкуs.

size_t strxfrm(char *s1, char *s2, size_t n) – символы строки s2 заменяет на соответствующие символы строкиs1, но не более чемnсимволов; возвращает количество замененных символов.

Кроме функций для работы со строками в библиотеке stringесть ряд функций для преобразования одномерных массивов байтов памяти:

int memcmp (const void *s1, const void *s2, size_t n) – сравнивает два блока памяти, начинающиеся с адресов s1 иs2, но не более, чемnбайтов; возвращает 0, если блоки равны, число меньшее 0, если первый блок меньше второго, число большее 0, если первый блок больше второго.

void *memcpy (void *dest, const void *src, size_t n) – копирует блок памяти srcв блок памятиdest, но не более, чемnбайтов; если блоки пересекаются, то результат не определен.

void*memccpy(void*dest, const void *src, int c, size_t n) – копирует блок памятиsrcв блок памятиdest; копирование останавливается по достижении количества вnбайтов или после копирования символаc.

void*memmove(void*dest,constvoid*src,size_tn) – копирует блок памятиsrcв блок памятиdest, но не более, чемnбайтов; копирование корректное даже если блоки памяти пересекаются.

void *memchr (const void *s, int c, size_t n) – в блоке памяти в nбайтов ищет символc, начиная с адресаs; если символ найден – возвращается указатель на найденный элемент, в противном случаеNULL.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]