Алгоритмизация и программирование Си
Практическое занятие №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 |