Similar presentations:
Программирование на языках высокого уровня. Массивы символов. Строки
1. Программирование на языках высокого уровня
Кафедра«Прикладная математика и информатика»
Ахмедханла д.М.
2. Массивы символов. Строки
Работа со строкамиреализуется путем использования
одномерных массивов типа char.
Символьная строка – это одномерный
массив, заканчивающийся нулевым байтом
Для нулевого байта определена
специальная символьная константа - ‘\0'.
3. Массивы символов. Строки
Если строка должна содержать nсимволов, то при описании массива
необходимо задать размер массива - n+1.
Допускаются строковые константы – это
строка символов, заключенная в двойные
кавычки. В конце строковой константы
автоматически ставится '\0‘
4. Массивы символов. Строки
Например:char stroka[7];
stroka=’’Москва’’;
В памяти эта строка будет выглядеть:
Москва\0
5. Массивы символов. Строки
Большинство операций языка Си++, имеющихдело со строками, работает с указателями. Для
размещения
в
оперативной
памяти
строки
символов необходимо:
выделить блок оперативной памяти под массив;
проинициализировать строку.
6. Массивы символов. Строки
Для выделения памяти под хранение строкимогут использоваться
функции динамического выделения памяти.
При этом необходимо учитывать требуемый
размер строки. Под хранение строки
выделяются последовательно идущие
ячейки оперативной памяти. Таким образом,
строка представляет собой массив
символов. Для хранения кода каждого
символа строки отводится один байт
7. Функции обработки строк
conio.hgetch(); ожидается ввода любого
символа
8. Функции обработки строк
gets(s);stdio.h
функция ввода строки
символов
Автоматически в конце строки ставится
нулевой байт
puts(s);
функция вывода строки
символов до нулевого символа
‘\0’
В качестве параметра функции ставится
имя массива
9. Функции обработки строк <string.h >
Функции обработки строк<string.h >
char *strcpy ( char *s, char *s1);
strcpy( s,s1 ); функция копирует строку s1 в s
char s[ ]=’’ kkk ‘’;
cout<<''\n''<<strcpy ( s, ‘’abcd’’)<<’’ \t‘’<<s;
Результат: abcd
abcd
10. Функции обработки строк <string.h >
Функции обработки строк<string.h >
char *strncpy ( char *s, char *s1, int n);
strncpy(s, s1, n ); копирует n символов s1 в массив
s
char s[ ]=’’abcdf’’;
1. cout<< strncpy ( s, ‘’kkkk’’, 4);
Результат: kkkk - хвост отбрасывается
2. cout<< strncpy ( s, ‘’kkkk’’, 2);
Результат: kkcdf - заменит только первые два
символа
11. Функции обработки строк <string.h >
Функции обработки строк<string.h >
char *strcat(char *s, char *s1 );
strcat( s, s1 );
функция конкотенации, присоединяет
строку s1 к s
s – увеличивается
s1- не изменяется
char s[ ]=’’abcd’’, s1[ ]=''kk'';
cout<< strcat ( s, s1 )<<’’\t’’<<s;
Результат: abcdkk
abcdkk
12. Функции обработки строк <string.h >
Функции обработки строк<string.h >
char *strncat (char *s, char *s1, int n);
strncat ( s, s1, n ); приписывает n символов
s1 к строке s
char s[ ]=’’abcd’’, s1[ ]=''kfk'';
cout<< strncat ( s, s1, 2 )<<’’\t’’<<s;
Результат: abcdkf
abcdkf
13. Функции обработки строк <string.h >
Функции обработки строк<string.h >
int strspn ( char *s, char *s1);
strspn( s, s1 );
определяет длину первого
сегмента s, содержащего
только символы из множества
s1
cout<< strspn( ‘’ abcdf’’, ‘’abk’’ );
Результат: 2
14. Функции обработки строк <string.h >
Функции обработки строк<string.h >
В результате работы этой функции строка s и
строка s1- остаются неизменными.
Если символы строки s1 в строке s не найдены,
результатом работы этой функции будет число
ноль.
15. Функции обработки строк <string.h >
Функции обработки строк<string.h >
int strcspn ( char *s, char *s1);
strcspn( s, s1 ); определяет длину первого
сегмента s, содержащие
символы не входящие в s1
int t= strcspn ( ‘’ abcdf’’, ‘’dk’’ );
cout<< t;
Результат: 3
16. Функции обработки строк <string.h >
Функции обработки строк<string.h >
В результате работы этой функции строка s и
строка s1- остаются неизменными.
Если символы строки s1 в строке s не найдены,
результатом работы этой функции будет длина
строки s без учета признака конца строки,
символа ‘\0’.
17. Функции обработки строк <string.h >
Функции обработки строк<string.h >
char *strstr (const char *s, const char *s1);
strstr( s, s1 ); ищет в строке s подстроку s1,
возвращает указатель на тот
элемент в строке s, с которого
начинается s1
s, s1 - остаются неизменными
cout<<strstr ( ‘’abcABCabc’’, ‘’ABC’’ );
Результат: Ababa
18. Функции обработки строк <string.h >
Функции обработки строк<string.h >
Функция возвращает указатель на тот элемент в
строке s, на тот символ, с которого начинается
строка s1. Если совпадений не обнаружено,
возвращается NULL.
Используя эту функцию совместно с cout, на
печать выводится часть строки s с положения
указателя и до конца этой строки.
19. Функции обработки строк <string.h >
Функции обработки строк<string.h >
char *strchr ( char *s, int c );
strchr ( s, c ); ищет в s первое вхождение
символа c
cout<<strchr ( ‘’abcAabc’’, 65 );
Результат: Aabc
s – остается неизменным
65 – код ‘A’.
20. Функции обработки строк <string.h >
Функции обработки строк<string.h >
int strset ( char *s, int c);
strset( s, c ); заполняет строку s символами c
char s[ ]=’’abcd’’;
cout<<strset ( s, 66 )<<’’\t’’<<s;
Результат: BBBB
BBBB
66 - код ‘B’.
21. Функции обработки строк <string.h >
Функции обработки строк<string.h >
В
приведенном
примере
строка
символом
инициализирована при объявлении массива.
Размер
массива
можно
не
указывать
при
объявлении массива. Он определяется длиной
цепочки символов при инициализации. Поэтому
радом с именем массива можно указаны пустые
квадратные скобки.
22. Функции обработки строк <string.h >
Функции обработки строк<string.h >
int strnset ( char *s, int c, int n);
strnset(s,c,n); первые n символов в s
заменяются символом с кодом с
cout<<strnset ( ‘’abcdf’’, 65, 3 );
Результат: AAAdf
23. Функции обработки строк <string.h >
Функции обработки строк<string.h >
char * strupr ( char *s );
strupr ( s );
преобразует буквы нижнего
регистра в буквы верхнего
cout<<strupr ( ‘’abc’’ );
Результат: ABC
24. Функции обработки строк <string.h >
Функции обработки строк<string.h >
char * strlwr ( char *s );
strlwr (s);
преобразует буквы верхнего
регистра в буквы нижнего
cout<<strupr ( ‘’ ABC’’ );
Результат: abc
25. Функции обработки строк <string.h >
Функции обработки строк<string.h >
int strcmp(char *s1, char *s2);
strcmp(s1,s2); посимвольно сравниваются
коды s1 и s2
Если:
s1=s2 – функция возвращает значение 0,
s1 < s2 – положительное значение
s1 > s2 – отрицательное значение
26. Функции обработки строк <string.h >
Функции обработки строк<string.h >
char *strrev ( char *s );
strrev( s );
char s[100];
gets(s);
puts ( strrev ( s) );
Если ввести: abcd
Результат:
dcba
инвертирование строки
// ввод строки
// вывод инвертированной строки
27. Функции обработки строк <string.h >
Функции обработки строк<string.h >
int strlen(char *s);
strlen( s );
char s=“asdfg”;
сout<<strlen(s);
Результат: 5
определяет длину строки
символов s
28. Обработка символов
salnum(c)isalpha(c)
возвращает
значение
true,
если с является буквой или
цифрой, и false в других случаях
возвращает
значение
true,
если с является буквой, и false в
других случаях
29. Обработка символов
isdigit(c)islower(c)
возвращает
значение
true,
если с является цифрой, и false в
других случаях
возвращает
значение
true,
если с является буквой нижнего
регистра, и false в других случаях
30. Обработка символов
isupper(c)isspace(c)
toupper(c)
возвращает
значение
true,
если с является буквой верхнего
регистра, и false в других случаях
возвращает
значение
true,
если с является пробелом, и false в
других случаях
если символ с, является символом
нижнего регистра, то функция
возвращает
преобразованный
символ с в верхнем регистре, иначе
символ
возвращается
без
изменений.
31. Задача
char symbolchar digit
char space
= 'd'; // буква
= '9'; // цифра
= ' '; // пробел
// аргумент буква или цифра
if(isalnum(symbol) ) cout << "true\n;
else cout << "false\n";
//является ли её аргумент буквой
if ( isalpha(symbol)) cout << "true\n";
else cout << "false\n";
32. Задача
char symbolchar digit
char space
= 'd'; // буква
= '9'; // цифра
= ' '; // пробел
//является ли её аргумент цифрой
if(isdigit(digit)) cout << "true\n";
else cout << "false\n";
//является ли её аргумент пробелом
if (isspace(space) ) cout << "true\n";
else cout << "false\n";
33. Задача
char symbolchar digit
char space
= 'd'; // буква
= '9'; // цифра
= ' '; // пробел
//является ли буквой нижнего регистра
if (islower(symbol) ) cout << "true\n";
else cout << "false\n";
//является ли буквой верхнего регистра
if( isupper(symbol)) cout << "true\n";
else cout << "false\n";
34. Задача
Подсчитать, сколько раз в тексте sвстретился «?»
Обозначения:
s[100] – массив символов, исходный текст
35. Программа
# include<iostream># include<stdio.h>
# include<conio.h>
# include<string.h>
using namespace std;
int main()
{ char s[100];
36. Программа
cout<<“\n Введите текст \n”;gets( s );
// ввод текста
for (int i=0, k=0; i<strlen(s); i++)
if (s[ i ] = = ‘?’ ) k++;
cout<<’’\n k=’’<<k;
getch();
}
37. Задача
Подсчитать количество предложений втексте
Обозначения:
s[100] – массив символов, исходный текст
Признак конца предложения – «!», «?», «.»
38. Программа
# include<iostream># include<stdio.h>
# include<conio.h>
# include<string.h>
using namespace std;
int main()
{ char s[100];
39. Программа
cout<<“\n Введите текст \n”;gets( s );
// ввод текста
for (int i=0, k=0; i<strlen(s); i++)
if (s[ i ]=='!' ||
s[ i ]=='.' ||
s[ i ]=='?' ) k++;
cout<<"\n k="<<k;
getch();}
40. Задача:
Подсчитать, сколько раз некоторое слововстретилось в тексте
Обозначения:
word – искомое слово
text – исходный текст
s – буфер, в котором хранится очередное
слово текста
41. Программа
# include<iostream># include<stdio.h>
# include<conio.h>
# include<string.h>
using namespace std;
int main()
42. Программа
{ char text[100], word[20], s[20]; int k,i;cout<<“\n Введите текст \n”;
gets(text);
// ввод текста
cout<<“\n Введите слово\n”;
gets(word);
// ввод слова
43. Программа
char *p=text;// указатель в начало текста
for ( i=0,k=0; i<strlen(text)-strlen(word)+1;
i++, p++)
if (strcmp( strncpy( s, p, strlen( word) ), word )==0) k++;
1
2
cout<<"\n k="<<k;
getch();
}
44. Задача
Удалить некоторое слово из текстаОбозначения:
text – исходный текст
word – искомое слово, которое необходимо
удалить
ntext – новый текст
45. Программа
# include <iostream># include <stdio.h>
# include <conio.h>
# include <string.h>
using namespace std;
int main()
{ char text[100], word[25];
46. Программа
char ntext[ ]="\0";// новый текст
cout<<“\n Введите текст \n”;
gets( text );
// ввод текста
cout<<\n Введите слово \n”;
gets( word );
// ввод слова
int k= strlen(word);
// длина слова
char *p=strstr(text,word); // поиск слова в тексте
// указатель установится в начале слова word
47. Программа
if (!p) cout<<“ \n SOS!!! ";else
{
// слово не найдено
// часть текста до «слова» в ntext
strncat( ntext, text, strlen(text)-strlen(p));
p=p+k;
// указатель перенести за слово
48. Программа
/* присоединение остатка предложения после «слова», еслионо не последнее */
if (p) strncat(ntext,p,strlen(p) );
cout<<“\n Новый текст \n”;
puts(ntext);
// печать нового текста
}
getch();
}
49. Задача:
Распечатать симметричные слова из текста(например асса)
Признаком конца слова считается пробел
Обозначения:
s - исходный текст
w - буфер слов
f - признак симметричности
50. Программа
# include<iostream># include<stdio.h>
# include<conio.h>
# include<string.h>
using namespace std;
int main()
{ char s[250],w[25];
//исходная строка, буфер слов
51. Программа
puts("\n Введите текст\n ");gets(s);
int t=0, i, len, j;
system("cls");
len=strlen(s);
puts("\n Исход. текст \n");
puts(s);
// ввод текста
// очистка экрана
// длина текста
// вывод исходного текста
52. Программа
puts("\n Симметричные слова \n");while(t<len)
{ //формируем слово до пробела
for( j=0,i=t; s[ i ] !=' '; i++, j++) w[ j ]=s[ i ];
//формируем конец строки, очистка буфера слов
w[ j ]='\0';
t=i+1;
int f=0;
//переходим к следующему слову
// признак симметричности
53. Программа
for ( i=0; i<strlen(w)/2; i++)if ( w[ i ] != w[ strlen(w) - i -1] ) f=1;
if ( f= =0 ) puts(w);
// печать симметричных слов
}
getch();
}
символы слева
символы справа