Добавил:
ФКН Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Семестр 1 / Алгоритмизация Практика 13 язык С

.pdf
Скачиваний:
111
Добавлен:
05.12.2019
Размер:
273.86 Кб
Скачать

Алгоритмизация и программирование Си

Практическое занятие №13

«Строки»

Строка — это массив символов (char’ов), в котором используемая часть отделена от неиспользуемой нуль-терминатором (0 или '\0'). Для удобства существует специальный синтаксис, позволяющий инициализировать такой массив строковым литералом (строка в двойных кавычках). Например, следующие два объявления полностью эквивалентны:

char s1[] = {'H', 'e', 'l', 'l', 'o', 0};

char s2[] = "Hello"; // 0 добавляется автоматически

Также можно присваивать строковые литералы указателям. В таком случае сама строка (сам массив) хранится в статической памяти, а указатель получает ее адрес:

char* s3 = "Hello";

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

О типе char

Тип char предназначен для хранения символов («букв»). На самом деле это 8-битный целочисленный тип с диапазоном значений -128..+127. Каждому числу из данного диапазона соответствует некоторый символ. Какой именно — определяется используемой кодировкой. По умолчанию для редактирования .cpp-файлов в Visual Studio используется кодировка Windows-1251, а в окне консоли — CP866. Таблицы символов данных кодировок можно найти в интернете (см. http://ru.wikipedia.org/wiki/Windows-1251 и http://ru.wikipedia.org/wiki/CP866). Для иллюстрации код буквы Б в кодировке Windows-1251 в десятичной и шестнадцатеричной системах:

int main(){

setlocale(LC_ALL, ".1251"); char c = 'Б';

int n = c;

printf("%c %d %x\n", c, (int)c, (int)(unsigned char)c); return 0;

}

Примечание: так как тип char имеет знак, десятичный код получается весьма странный: -63. В традиционной записи, где символы нумеруются от 0 до 255, этот символ имеет код 256-63=193 (что как раз соответствует шестнадцатеричному c1).

Практическоезанятие№13

Страница1

Алгоритмизация и программирование Си

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

Библиотека string.h содержит ряд полезных функций для работы со строками:

strlen — определение длины строки;

strcpy — копирование одной строки в другую;

strcat — конкатенация («склеивание») строк;

strcmp — лексикографическое сравнение строк;

strstr, strchr, strspn — поиск в строке подстроки или символа;

и др.

Задания для самостоятельного решения (2 балла)

Задание 1 (1 балл).

Напишите и протестируйте свою функцию определения длины строки, полностью аналогичную библиотечной strlen.

Задание 2 (1 балл).

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

Практическоезанятие№13

Страница2

Алгоритмизация и программирование Си

Пример программы

Поиск и замена целого слова по всей строке (как часть слово не заменяется)

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

#define SRC "simple" #define DST "sample" #define LEN 6

int main()

{

char str[] ="This is a simple simple string and megasimple example"; char * p = str-1;

/* для каждого вхождение*/ do{

/* найти следующее*/ p = strstr (p+1, SRC);

/* если найдено отдельное слово*/ if(p!=NULL&&(p==str||!isalnum(p[-1]))&&(p[LEN]==0||!isalnum(p[LEN])))

{

strncpy (p,DST,LEN); /* замещать*/

}

}

while(p != NULL); puts (str); return 0;

}

This is a sample sample string and megasimple example

--------------------------------

Process exited after 0.1378 seconds with return value 0

Для продолжения нажмите любую клавишу . . .

Практическоезанятие№13

Страница3