ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 23.06.2021

Просмотров: 1695

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

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"; 


background image

47 

10. Символьная информация и строки 

 
Для  символьных  данных  в  Си++  введен  тип  char.    Для  представления 

символьной информации используются символы, символьные переменные и текстовые 
константы. 

Примеры: 
const char c=’c’; //символ – занимает один байт, его значение не меняется 
char  a,b;//символьные  переменные,  занимают  по  одному  байту,  значения 

меняются 

const char *s=“Пример строки\n” ;//текстовая константа 
Строка  в  Си++  -  это  массив  символов,  заканчивающийся  нуль-символом  –  ‘\0’ 

(нуль-терминатором).  По  положению  нуль-терминатора  определяется  фактическая 
длина  строки.  Количество  элементов  в  таком  массиве  на  1  больше,  чем  изображение 
строки. 

\

“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 – размер указателя 
 
Примеры: 


background image

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,  то  результат  равен 


background image

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); 

Приписывает 

первые 

символов строки 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: 


background image

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";