Similar presentations:
Организация работы со строками
1. Организация работы со строками
Строки, как частный случай массивов2. Строковые типы
В разных языках строки представлены по-разному.Различают типы представляющие:
отдельные символы, чаще всего его называют
типом char;
строки постоянной длины, часто они
представляются массивом символов;
строки переменной длины - это, как правило, тип
string.
3. ASCII (англ. Американский стандартный код для обмена информацией)
Таблица кодировок, в которой некоторымраспространённым печатным и непечатным символам
сопоставлены числовые коды. Разработана и
стандартизована в США в
1963 году.
Таблица ASCII определяет коды для символов:
• десятичных цифр;
•латинского алфавита;
• национальный алфавит;
• знаки препинания;
• управляющие символы.
4. Unicode
Глобальный стандарт кодировки символов, которыйиспользуется для привязки кода ко всем
существующим письменным знакам и символам,
содержащимся во всех языках, используемых для
письменного общении во всем мире.
Определяет коды для более 128 000 символов. Имеет
различные форматы кодировки - Форматы
преобразования Юникода (Unicode Transformation
Format - UTF).
UTF-8.
UTF-16.
UTF-32.
5. Строки- частный случай массивов
Var st : array [1..100] of char;st:=‘Hello world’;
1
2
3
4
5
6
H
E
L
L
O
7
8
9
10
11
W
O
R
L
D
char st[]={‘ H’, ’e’, ’l’, ’l’, ’o’, ’ ’, ‘w’, ’o’, ’r’, ’l’, d’, ’\0’};
char st1[]=“Hello world”;
char st2[100]=“Hello world”;
0
1
2
3
4
H
E
L
L
O
5
6
7
8
9
10
11
W
O
R
L
D
\0
5
6
7
8
9
10
11
W
O
R
L
D
\0
char *st1=“Hello world”;
st1
0
1
2
3
4
H
E
L
L
O
6.
char *st1 = "Hello World";Строку, которая была присвоена не массиву, а указателю, также
можно получить, обратившись по указателю.
Вводится строковый объект - строковая константа. Ссылка на первый
элемент этой строки присваивается указателю.
Поменять значение элементов строки не можем
printf("%c\n",st1[3]); //l
strP[3] = 'z';
/* не получится
совершается попытка изменить строку-константу*/
scanf("%s",st1);
// ошибка сегментирования
Память была выделена только под указатель - записать строку некуда
7. Тип String
VARStr1: STRING;
Str: STRING[20];
8. Типы строк
CC
C
C
0
1
2
3
…
L
L
L
L
C
C
0
1
2
3
4
…
L
L
L
L
C
C
…
0
1
2
3
ANSI, L <=255
• AnsiString = LongString
L <=231
• WideString
Unicode L <=230
• PChar
…
L
• ShortString
C
C
L
…
C
C
L+3
C
C
L*2+3
L
L
L
L
C
C
0
1
2
3
4
…
C
C
C
C
C
…
• PWideChar
0 1 2 3
C
…
…
C
#0
L+1
C
#0
2L
2L+1
9. Методы для обработки строк
Функциональное назначение методов:Создание и удаление строк.
Копирование и объединение.
Длина и позиционирование.
Представление строки.
Преобразования строки в иной тип.
Преобразования иного типа в строку.
Сравнение строк.
10. Средства модуля System
VAR Words: STRING;BEGIN
Write ('Введите, пожалуйста, слово: ');
Вызов
Описание
ReadLn (Words);
:= 'Фирма Microsoft';
Length(S)
Длина WriteLn
строки ('Это
S Words
слово
из ', Length
(Words):3,
' букв!');
FOR
:=состоит
1 TO Length
(Words)
DO
Words
:=i 'картографирование';
END.
UpCase(S)
Cтрока
S в :=
верхнем
регистре
Words[i]
:= UpCase (Words[i]);
Words
'Электрификация';
WriteLn(Words);
WriteLn(Words);
{Выводится текст
Search_Word
:= 'кац';
Word1
:= Copy(Words,6,4);
Copy(S, I, Count)
Копирует
Count
символов
строки
S с номера I.
'Фирма
MICROSOFT'} Words);
Position
:=WriteLn(Word1);
Pos(Search_Word,
{На экран выводится 'граф'}
IF Position
<>
THEN
Pos(S1,S2)
Позиция
подстроки
S1
в строке S2
:= Copy(Words,2,3);
WordsWord2
:= 0'компьютеризация';
WriteLn
('Фрагмент
"', Search_Word,
'" содержится','
в слове "',
WriteLn(Word2);
{На экран
выводится 'арт'}
Delete(Words,1,7);
Insert(S1,S2, I)
Ввести подстроку
S2
в
строку
S1,
начиная
с
позиции
I.
Words, '", начиная с позиции ', Position:3, '.')
Delete(Words,3,2);
ELSE Word1 := 'Г';
Delete(S, I,C)
Удаляет
С символов строки S с номера I.
WriteLn
('Фрагмент "', Search_Word, "' не содержится ',
Insert(Word1,Words,1);
Concat(S1,S2,SN)
Конкатенация
строк
S1,
S2'".');
…SN.
' в слове
Words,
Word1
:="',
'не';
S1:=‘пар’;
Insert(Word1,Words,3);
LowerCase(S)S2:=‘о’; Строка S в нижнем
регистре. { Words=Генерация}
S3:=‘воз’;
x:=123.45;
Str(X; S) Val(Str,Val,Code);
Преобразовать
число X в строку S.
S1:=Concat(s1,s2,s3);
Writeln(Val);
// Ответ 1.2345000000E+02
Str(x:7:3,Str);
Val(S,V, C)Val(’123Z’,Val,Code);
Преобразует
строку
S//всОтвет
число
V. При
ошибкепозиции)
вC
// Строка
writeln(Str);
=> число
ошибкой
123.450
(3Substr:=StringOfChar(‘A’,4);
дробных
заносится
номер
ошибочного
символа
строки S.
writeln(Val , Code);
// ОтветStr(x,Str);
4 – номер
позиции с ошибкой
// Подстрока
Substr = ‘AAAA’
writeln(S); // Ответ 1.2345000000E+02
StringOfChar(c,
count)
Строка из count символов C
11. Средства модуля SysUtils
ВызовДействие
IntToStr(V).
Превращает целое число V в строку.
StrToInt(S)
Превращает строку S в целое
число.
StrToFloat(S)
Превращает строку S в число.
FloatToStr(V)
Превращают число V в строку.
FloatToStrF(V,Format)
Format :
ffcurrency – денежный,
ffExponent – научный,
ffFixed – фиксированный,
ffGeneral – обобщенный, с самым
коротким результатом,
ffNumber – фиксированный с
разделителями тысяч
Превращают число V в строку,
используя формат вывода Format
S:=FloatToStr(V,ffFixed,6,3);
// Число => строка с форматом
writeln(S); // Ответ 123.450
12. Определить, является ли строка палиндромом. Палиндром – это число, слово или фраза, одинаково читающиеся в обоих направления.
Определить, является ли строка палиндромом.Палиндром – это число, слово или фраза, одинаково
читающиеся в обоих направления.
РадаР, ТопоТ, ПотоП
var
s: string;
i: byte; flag: boolean;
begin
write('String: ');
readln(s);
flag := true;
for i := 1 to length(s) div 2 do
if s[i] <> s[length(s)-i+1] then begin
writeln('No palindrome');
flag := false;
break;
end;
if flag then
write('Palindrome');
readln
end.
13. Найти в строке определенную последовательность символов и заменить ее другой.
vars,s_old,s_new: string;
i,l_old: byte;
begin
write(‘Исходная строка: '); // я изучаю Turbo Pascal
readln(s);
write(‘Что заменить?'); //Тurbo
readln(s_old);
l_old := length(s_old);
write(‘Чем заменить? '); //Free
readln(s_new);
i := pos(s_old,s);
delete(s,i,l_old);
insert(s_new,s,i);
writeln(s); // я изучаю Free Pascal
end.
14. Выделить из строки целые числа и поместить их в массив.
vararr: array[1..100] of string;
i, j: integer; strinput, str: string;
a: char;
n: byte;
begin
i := 1;
j := 1; str:=‘’;
readln(strinput); //abc 56 de7 ff15
n := length(strinput); //15
while i <= n do begin
a := strinput[i];
while (a >= '0') and (a <= '9') do
begin
str := str + a; i := i + 1; a := strinput[i]
end;
i := i + 1;
if str <> '' then begin arr[j] := str; j := j + 1; str := '‘;
end;
for i := 1 to j - 1 do
write(arr[i]:6); // 56
7 15
end.
end;
15. Оставить в строке только один экземпляр каждого встречающегося символа.
vars1,s2,s3: string;
i: byte;
begin
write('String: '); // adc hghj fgc yugl aa
readln(s1);
s2 := '';
for i:=1 to length(s1) do
begin
s3 := copy(s1,i,1);
if pos(s3,s2) = 0 then
s2 := s2 + s3
end;
writeln('String: ',s2);
readln
end.
16. Необходимо сформировать из встречающихся в предложении слов их массив. При этом повторяющиеся слова не должны входить в массив
дважды.var u,w: string; i, j, q: integer;
ws: array[1..100] of string; : string; len: integer;
begin
writeln('Введите текст: ');
read(u);
len := length(u);
i := 1; q:=0;
while i <= len do
if (lowercase(u[i]) >= 'a') and (lowercase(u[i]) <= 'z') then
begin w := lowercase(u[i]);
i := i + 1;
while (i <= len) and ((lowercase(u[i]) >= 'a') and (lowercase(u[i]) <= 'z')) do
begin w := w + lowercase(u[i]); i := i + 1; end;
j := 1;
while (j <= q) and (w<>ws[j]) do
j := j + 1;
if j > q then
begin q := q + 1; ws[q] := w; end;
end
else i := i + 1;
for i := 1 to q do
writeln(ws[i]); end.
17. Удалить в строке все лишние пробелы. Лишними считаются пробелы, следующие непосредственно за пробелами. Т.е. между словами
всегда должен находиться один пробел18. Средства модуля String
ВызовДействие
StrNew(S)
Создать строку S.
StrDispose(S);
Удалить строку S.
StrCopy(Dest, Source)
Копирует в строку Dest строку Source.
StrLCopy(Dest, Source,
Копирует в строку Dest строку Source с ограничением в MaxLen
MaxLen)
числа символов в Dest.
StrMove(Dest, Source, Count) Копирует в строку Dest из строки Source Count символов с
заменой.
StrCat(Dest, Sourcе)
Присоединяет к строке Dest копию строки Source.
StrLCat(Dest, Source, MaxLen) Присоединяет к строке Dest копию строки Source. Число
символов в результирующей строке не больше MaxLen.
StrCopy(Dest, Source)
Копирует в строку Dest строку Source.
StrLCopy(Dest, Source,
Копирует в строку Dest строку Source с ограничением в MaxLen
MaxLen)
числа символов в Dest.
19.
StrLen(Str:pChar)Возвращает длину строки без учета символа с кодом #0.
StrEnd(Str:pChar)
Возвращает указатель на конец строки.
StrPos(Str1, Str2)
Возвращает указатель на начало первого появления строки
StrScan(Str, Chr)
StrRScan(Str, Chr)
Str2 в Str1
Возвращает указатель на первое появление символа Chr в
строке Str.
Возвращает указатель на последнее появление символа Chr в
строке Str.
StrLower(Str)
Перевод строчных букв в прописные (только латинские).
StrUpper(Str)
Перевод прописных букв в строчные (только латинские).
StrPas(Str)
pChar -> string.
StrPCopy(Dest, Source)
string -> pChar.
StrComp(Str1, Str2)
Сравнивает строки. Возвращается: число < 0, если Str1<Str2,
StrIComp(Str1, Str2)
0, если Str1=Str2, число > 0, если Str1>Str2.
То же, но игнорируется разница в высоте латинских букв.
StrLComp(Str1, Str2, MaxLen)Подобна StrComp, но сравниваются первые MaxLen символов.
20.
uses SysUtils;var
p1,p2,p3,p:pChar; s1,s2:string; MaxLen:word;
begin
p:=StrNew(’1234′); // Создать строку (аргумент не пустой)
StrDispose(p);
// Удалить строку
p1:=StrNew(‘AAAAAAAAAAAAAAAA’);
p2:=StrNew(’123456′);
p3:=StrNew(‘abcdef’);
StrCopy(p1,p2);
// Копировать p2 в p1
s1:=StrPas(p1);
// Преобразовать p1 в s1 для вывода
writeln(s1);
// s1 = 123456
StrLCopy(p1,p2,4);
// Копировать p2 в p1 с ограничением длины
writeln(StrPas(p1));
// 1234
p1:=StrMove(p1,p3,2);
// Копирование из p3 2 элементов в p1 с заменой
writeln(StrPas(p1));
// ab34
p1:=StrLCat(p1,p2,8);
// Дописать p3 в p1 с ограничением длины
writeln(StrPas(p1));
// ab34abcd
End;
21.
varp1,p2,p4:pChar;
x:integer;
begin
p1:=StrNew(‘ABC123′);
p2:=StrNew(‘abc123’);
p4:=StrNew(’ABC456’);
x:=StrComp(p1,p3);
writeln(x);
x:=StrComp(p1,p2);
writeln(x);
x:=StrComp(p4,p1);
writeln(x);
x:=StrIComp(p2,p1);
writeln(x);
x:=StrLComp(p1,p4,3);
writeln(x);
x:=StrLIComp(p1,p4,4);
writeln(x);
End;
// p1 < p2
// x = -32
// p4 > p1
// x = 3
// p2 = p3
// x = 0
// p1 = p4
// x = 0
// Сравнить p1 и p4
// x = -3
22. Вывод строки в С
char str1[10] = {'Y','o','n','g','C','o','d','e','r','\0'};char str2[10] = "Hello!";
char str3[] = "Hello!";
for(int i = 0; i < 10; i ++)
printf("%c",str1[i]);
puts(str1); // с переводом строки
printf("%s\n",str2);
fputs(str3,stdout); // без перевода на новую строку
23. А как считать строку с консоли в языке C ?
char bf[12]="Hello World";scanf("%s",bf);
/* количество введенных символов на единицу меньше
размера буферной переменной. Считывание до первого
пробела*/
puts(bf);
char bf[12],ch;
int max_len = sizeof(bf),int i=0;
while((ch = getchar())!= '\n'&& ch!= EOF&&i< max_len-1)
bf[i++]= ch;
bf[i++]='\0';
/*посимвольное считывание до enter или длины буфера*/
puts(bf);
int n =10;
char bf[n];
fgets(bf, sizeof(bf), stdin);
fflush(stdin); // очищаем поток ввода
24. Найти в строке заданный символ. Первая строка - символ, который необходимо найти. Затем с новой строки записана символьная
строка, в которой нужно осуществить поиск. Длинастроки не превышает 100 символов.
Вывести индекс первого вхождения искомого символа или -1, если символ
не найден.
char bf[100];
char ch=getchar();
getchar(); fflush(stdin);
int n=-1, i=0;
fgets(bf,sizeof(bf),stdin);
do
if (bf[i]==ch) {n=i; break;}
while(bf[i++]!='\0');
printf("%d",n);
25. Стандартные функции работы со строками в С
Необходимо подключить заголовочный файл string.hstrlen(str) – длина строки str;
strcmp(str1, str2) – сравнение строк str1 и str2;
strcat(str1, str2) – конкатенация (склеивание) двух
строк. К строке str1 в конце приклеивается
строка str2;
strncat(str1, str2,max_len) – конкатенация с
установкой максимальной длины;
strcpy(str1, str2) – копирование строки str2 в
строку str1;
strncpy(str1, str2, max_len) – копирование c
контролем длины, без дописывания ‘\0’.
26.
if(strcmp(s1, s2) == 0)puts("Strings are equal!");
else
puts("Strings are not equal!");
char str_cat[100] = “Ivan";
char str[15] = “Ivanov";
strcat(str_cat, str);
printf("%s", str_cat); // Ivan Ivanov
printf("\n");
size_t max_add = sizeof(str) - strlen(str) - 1;
strncat(str, str_cat, max_add);
str[sizeof(str) - 1] = '\0';
printf("%s", str); // Ivanov Ivan Iv
27.
char s_1[100] = "Source string";char d_1[20], d_2[10];
int max_len = sizeof(d_1)-1;
strcpy(d_1, s_1);
strncpy(d_2, “Ivanov", 4);
d_2[4] = 0;
puts(d_1); //Source string
puts(d_2); //Ivan
28. Выберем все строки, которые начинаются с фрагмента «Sh»:
Выберем все строки, которые начинаются с фрагмента «Sh»:const char* str[] = { "Ship", "Shopping", "Shematic", "Super",
"Car", "Sherif"};
for(int i = 0; i < sizeof(str) / sizeof(*str); ++i)
if(strncmp(str[i], "Sh", 2) == 0)
puts(str[i]);
/* Ship
Shopping
Shematic
Sherif */
29. Поиск символов и подстрок
char* strchr(const char* str, int val); выполняет поисксимвола слева-направо с кодом val в строке str;
char* strrchr(const char* str, int val); выполняет
поиск символа справа-налево с кодом val в строке
str;
char* strstr(const char* str, const char* find);
выполняет поиск слева-направо подстроки find в
строке str;
char* strpbrk(const char* str, const char* find);
выполняет поиск слева-направо любого символа из
подстроки find в строке str.
30.
char str[] = "Abrakadabra";char *ptr = strchr(str, 'a');
printf("str = %p\nptr = %p\n", str, ptr);
if(ptr != NULL)
/* str = 0062ff10
ptr = 0062ff13
printf("*ptr = %c\n", *ptr);
*ptr = a */
char *ptr1 = strstr(str, "ra");
printf("str = %p\nptr = %p\n", str, ptr1);
if(ptr1 != NULL)
/* str = 0062ff10
printf("ptr: %s\n", ptr1);
ptr = 0062ff12
ptr: rakadabra */
31. pass = 0062ff0f ptr = 0062ff16 ptr: !#$$A
char pass[] = "dfdfg90!#$$A";char *ptr = strpbrk(pass, "@!#$^&?");
printf("pass = %p\nptr = %p\n", pass, ptr);
if(ptr != NULL)
printf("ptr: %s\n", ptr);
pass = 0062ff0f
ptr = 0062ff16
ptr: !#$$A
32.
Запись форматированной строки в буферную переменнуюdouble width = 2.4, height = 0.76, depth = 3.14;
char name[] = "Chair";
char info[100];
sprintf(info, "(%s: %.2f x %.2f x %.2f)", name, width, height, depth);
puts (info);
// (Chair: 2.40 x 0.76 x 3.14)
int var_i = -123;
char str_var[10];
sprintf(str_var, "%d", var_i);
puts(str_var); //-123
double var_d = 35.7895;
sprintf(str_var, "%.2f", var_d); //35.79
33.
Забегая вперед)int main(void)
{
double width = 2.4, height = 0.76, depth = 3.14;
char name[] = "Chair";
const size_t size = strlen(name) + 100;
char* info = (char *)malloc(size + 100);
sprintf(info, "(%.30s: %.2f x %.2f x %.2f)", name, width,
height, depth);
puts(info);
free(info);
return 0;
}
34. Сколько раз подстрока входит в строку
#include <stdio.h>#include <string.h>
int main()
{ char str[100], substr[100];
int count = 0, len1, len2;
printf("Enter a string: ");
fgets(str, 100, stdin);
printf("Enter a substring: ");
fgets(substr, 50, stdin);
len1 = strlen(str) - 1; // удаляем \0
len2 = strlen(substr) - 1; //
for (int i = 0; i <= len1 - len2; i++)
if (strncmp(&str[i], substr, len2) == 0) count++;
printf("Подстрока %s встречается %d раз(а) в строке %s.\n", substr, count, str);
return 0;
}
35. Преобразование из строк в числа
int atoi(const char* str); для преобразования целых чиселиз строк в тип int;
long atol(const char* str); для преобразования целых чисел
из строк в тип long;
long long atoll(const char* str); для преобразования целых
чисел из строк в тип long long;
double atof(const char* str); для преобразования
вещественных чисел из строк в тип double.
Преобразование выполняется либо до первого нечислового
символа, либо выдается 0, если строка изначально не может
быть интерпретирована как число