ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 23.06.2021
Просмотров: 1695
Скачиваний: 3

46
cout<<"\nEnter n";
cin>>n;//строки
cout<<"\nEnter m";
cin>>m;//столбцы
//выделение памяти
int **matr=new int* [n];// массив указателей на строки
for(i=0;i<n;i++)
matr[i]=new int [m];//память под элементы матрицы
//заполнение матрицы
for(i=0;i<n;i++)
for(j=0;j<m;j++)
matr[i][j]=rand()%10;//заполнение матрицы
//печать сформированной матрицы
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
cout<<matr[i][j]<<" ";
cout<<"\n";
}
//удаление строки с номером к
int k;
cout<<"\nEnter k";
cin>>k;
int**temp=new int*[n-1];//формирование новой матрицы
for(i=0;i<n;i++)
temp[i]=new int[m];
//заполнение новой матрицы
int t;
for(i=0,t=0;i<n;i++)
if(i!=k)
{
for(j=0;j<m;j++)
temp[t][j]=matr[i][j];
t++;
}
//удаление старой матрицы
for(i=0;i<n;i++)
delete matr[i];
delete[]matr;
n--;
//печать новой матрицы
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
cout<<temp[i][j]<<" ";
cout<<"\n";
}
}

47
10. Символьная информация и строки
Для символьных данных в Си++ введен тип char. Для представления
символьной информации используются символы, символьные переменные и текстовые
константы.
Примеры:
const char c=’c’; //символ – занимает один байт, его значение не меняется
char a,b;//символьные переменные, занимают по одному байту, значения
меняются
const char *s=“Пример строки\n” ;//текстовая константа
Строка в Си++ - это массив символов, заканчивающийся нуль-символом – ‘\0’
(нуль-терминатором). По положению нуль-терминатора определяется фактическая
длина строки. Количество элементов в таком массиве на 1 больше, чем изображение
строки.
A
\
0
A
“A”
стро
ка (2байта)
‘
A’
с
имвол
(1байт)
Рис.2. Представление строки и символа
Присвоить значение строке с помощью оператора присваивания нельзя.
Поместить строку в массив можно либо при вводе, либо с помощью инициализации.
Пример
void main()
{
char s1[10]="string1";
int k=sizeof(s1);
cout<<s1<<"\t"<<k<<endl;
char s2[]="string2";
k=sizeof(s2);
cout<<s2<<"\t"<<k<<endl;
char s3[]={‘s’,’t’,’r’,’i’,’n’,’g’,’3’}
k=sizeof(s3);
cout<<s3<<"\t"<<k<<endl;
char *s4="string4";//указатель на строку, ее нельзя изменить
k=sizeof(s4);
cout<<s4<<"\t"<<k<<endl;
}
Результаты:
string1 10 – выделено 10 байтов, в том числе под \0
string2 8 – выделено 8 байтов (7+1байт под \0)
string3 8 – выделено 8 байтов (7+1байт под \0)
string4 4 – размер указателя
Примеры:

48
char *s=”String5”; - выделяется 8 байтов для строки
char*ss; - описан указатель
ss=”String6”;//память не выделяется , поэтому программа может закончиться
аварийно.
char *sss=new char[10];//выделяем динамическую память
strcpy(sss,”String7”);//копируем строку в память
Для ввода и вывода символьных данных в библиотеке языка СИ определены
следующие функции:
int getchar(void) - осуществляет вод одного символа их входного потока, при
этом она возвращает один байт информации (символ) в виде значения типа int. Это
сделано для распознавания ситуации, когда при чтении будет достигнут конец файла.
int putchar (int c) – помещает в стандартный выходной поток символ c.
char* gets(char*s) – считывает строку s из стандартного потока до появления
символа ‘\n’, сам символ ‘\n’ в строку не заносится.
int puts(const char* s) записывает строку в стандартный поток, добавляя в конец
строки символ ‘\n’, в случае удачного завершения возвращает значение больше или
равное 0 и отрицательное значение (EOF=-1) в случае ошибки.
Примеры:
1. char s[20];
cin>>s;//ввод строки из стандартного потока
cout<<s;//вывод строки в стандартный поток
Результат работы программы:
При вводе строки “123 456 789”, чтение байтов осуществляется до первого
пробела, т. е. в строку s занесется только первое слово строки “123/0”, следовательно,
выведется: 123.
2. char s[20];
gets(s);//ввод строки из стандартного потока
puts(s);//вывод строки в стандартный поток
Результат работы программы:
При вводе строки “123 456 789”, чтение байтов осуществляется до символа ‘\n’,
т. е. в s занесется строка”123 456 789\n\0”, при выводе строки функция puts возвращает
еще один символ ‘\n’, следовательно, будет выведена строка “123 456 789\n\n”.
3. char s[20];
scanf(“%s”,s);//ввод строки из стандартного потока
printf(“%s”,s);//вывод строки в стандартный поток
Результат работы программы:
При вводе строки “123 456 789”, чтение байтов осуществляется до первого
пробела, т. е. в строку s занесется только первое слово строки “123/0”, следовательно,
выведется: 123. Т. к. s – имя массива, т. е. адрес его первого элемента, операция & в
функции scanf не используется.
Для работы со строками существуют специальные библиотечные функции,
которые содержатся в заголовочном файле
string.h
. Рассмотрим некоторые из этих
функций:
Прототип функции
Краткое описание
Примечание
unsigned
strlen
(const
char*s);
Вычисляет длину строки s.
int
strcmp
(const
char*s1, const char *s2);
Сравнивает строки s1 и s2.
Если s1<s2, то результат
отрицательный,
если
s1==s2, то результат равен

49
0, если s2>s1 – результат
положительный.
int
strcnmp
(const
char*s1, const char *s2);
Сравнивает первые n символов
строк s1 и s2.
Если s1<s2, то результат
отрицательный,
если
s1==s2, то результат равен
0, если s2>s1 – результат
положительный.
char*
strcpy
(char*s1,
const char*s2);
Копирует символы строки s1 в
строку s2.
char*
strncpy
(char*s1,
const char*s2, int n);
Копирует n символов строки s1
в строку s2.
Конец
строки
отбрасывается
или
дополняется пробелами.
char*
strcat
(char*s1,
const char*s2);
Приписывает строку s2 к строке
s1
char*
strncat
(char*s1,
const char*s2);
Приписывает
первые
n
символов строки s2 к строке s1
char*
strdup
(const
char*s);
Выделяет память и переносит в
нее копию строки s
При выделении памяти
используются функции
Пример1:
Дана строка символов, состоящая из слов, слова разделены между собой
пробелами. Удалить из строки все слова, начинающиеся с цифры.
#include <stdio.h>
#include <string.h>
void main()
{
char s[250], //исходная строка
w[25], //слово
mas[10][25];//массив слов
puts(“\nвведите строку”);
gets(s);
int k=0,t=0,i,len,j;
len=strlen(s);
while(t<len)
{
for(j=0,i=t;s[i]!=’ ‘;i++,j++)w[j]=s[i];//формируем слово до пробела
w[j]=’/0’;//формируем конец строки
strcpy(mas[k],w);//копируем слово в массив
k++;//увеличиваем счетчик слов
t=i+1;//переходим к следующему слову в исходной строке
}
strcpy(s,””);//очищаем исходную строку
for(t=0;t<k;t++)
if(mas[t][0]<’0’&&mas[t][0]>’9’)//если первый символ не цифра
{
strcat(s,mas[t]);//копируем в строку слово
strcat(s,” “);//копируем в строку пробел
}
puts(s);//выводим результат
}
Пример2:

50
Сформировать динамический массив строк. Удалить из него строку с заданным
номером.
#include <iostream.h>
#include <string.h>
void main()
{
int n;
cout<<"\nN=?";cin>>n;
char s[100];
char**matr=new char*[n];
for(int i=0;i<n;i++)
{
cout<<"\nS=?";
cin>>s;
matr[i]=new char[strlen(s)];
strcpy(matr[i],s);
}
for(i=0;i<n;i++)
{
cout<<matr[i];
cout<<"\n";
}
int k;
cout<<"\nK=?";
cin>>k;
if(k>=n){cout<<"There is not such string\n";return;}
char **temp=new char*[n-1];
int j=0;
for(i=0;i<n;i++)
if(i!=k)
{
temp[j]=new char[strlen(matr[i])];
strcpy(temp[j],matr[i]);
j++;
}
n--;
for(i=0;i<n;i++)
{
cout<<temp[i];
cout<<"\n";
}
}