Строки в С
Строки в С
Строки в С++
Строки в С++
Строки в С++
Строки в С++
Строки в С++
Строки в С++
Строки в С++
Строки в С++
Строки в С++
Строки в С++
Строки в С++
Строки в C++.
Лекция 8. Строки в C++.
Лекция 8. Строки в C++.
3.84M
Категория: ПрограммированиеПрограммирование

Строка в C (лекция 8)

1. Строки в С

Строка в C — это массив символов, заканчивающийся нулевым
символом (‘\0’). Строка доступна через указатель на первый
символ в строке. Значением строки является адрес ее первого
символа.
Исторически символ занимает 1 байт, в этом случае он имеет тип
char.
При этом существуют и другие кодировки, в которых символ
представляется, например, двумя байтами. Для работы с такими
строками требуются специальные функции.

2.

Строки в С
Между однобайтными и фиксированными многобайтными
строками принципиальной разницы нет. В С/С++ существует
специальный тип для многобайтных символов - wchar_t и
специальные функции для работы со строками, состоящими из
таких символов.
Размер wchar_t не фиксирован в стандарте и определяется
реализацией компилятора. На многих платформах и компиляторах
это два байта, соответствующих кодировке Unicode.

3.

Строки в С
Символы
Символьная переменная — это переменная типа char,
занимающая в памяти 1 байт. В отличие от строк, символ — это
встроенный интегральный тип в С, для него допустимы все
операции, допустимые для интегральных типов.
Существуют символьные литералы, они записываются в
одинарных кавычках (прямых апострофах). Пример символьного
литерала:
char sym;
sym='A'; //Символьный литерал. Его значение – код символа
А(латинское) в используемой кодировке
В вышеприведенном примере значением sym является 65 в
кодовой таблице ASCII. В этом случае строка sym=’A’ абсолютно
эквивалентна строке sym=65. Однако, в целях улучшения
портируемости лучше всегда использовать запись в апострофах

4. Строки в С

Для записи символьных литералов типа wchar_t используется
запись, аналогичная записи для строковых литералов этого типа:
wchar_t sym;
sym=L'ab'; //Символьный многобайтовый литерал. Количество
символов между апострофами зависит от размера типа wchar_t
Существует специальный формат для записи символьных
литералов – слеш, за которым идет код символа. Такая форма
записи необходима, если мы хотим использовать элемент, не
отображающийся в печатный символ, например нуль-терминатор,
который представляется так: ’\0’.

5.

Строки в С
ПРИМЕЧАНИЕ
В фрагменте
char sym1;
char sym2;
char sym3;
sym1=0; //(1)
sym2='\0'; //(2)
sym3='\0x00'; //(3)
строки (1), (2) и (3) имеют один и тот же эффект. Однако вторая и
третья запись считаются нагляднее – мы сразу видим, что
работаем именно с символом.
Не путайте ‘\0’, ‘0’ и “0”. Первое – символьный литерал,
соответствующий символу с кодом 0. Второе – такой же литерал,
но обозначающий цифру 0, ее код в ASCII-кодировке 48. Третий —
это строковый литерал, содержащий два символа, цифру 0 и нультерминатор.

6. Строки в С++

Создание строк
В С++ существует 2 типа строк.
Первый из них - это массив переменных типа char.
Например:
char name[50]; cin>>name; cout<<"Hello "<<name<<endl;
Второй из вариантов, более удобный - это специальный класс
string
Для его работы необходимо в начале программы подключить
заголовочный файл string:
#include <string>

7. Строки в С++

Объявление строк
char str1[10]; // Строка - массив из 10 символов. Начальное
значение символов не определено.
char str2[10]="Hello";
/* Используется инициализация (не присваивание!). В первые 5
символов записывается “Hello”, в 6 – нуль-терминатор, значение
трех последних не определено.*/
char str3[10]={'H', 'e', 'l', 'l', 'o', '\0'};
//Эквивалентно предыдущему.

8. Строки в С++

Объявление строк
char str4[10]="Very long line"; //Ошибка. Массив из 10
элементов нельзя инициировать более длинной
последовательностью.
char str5[]="Very long line"; /*Компилятор автоматически
определяет длину массива (в нашем случае 15) и инициализирует
его последовательностью символов. */
char* str6;
/*Строка - указатель на символ. В большинстве случаев для ее
использования
потребуется выделить память.*/
str6=(char*) malloc(10);
free(str6);

9. Строки в С++

Примеры неверных присваиваний.
Пример 1.
char str1[10], str2[10];str1="Hello";str2=str1;
//Одна и та же ошибка в обоих операторах =.
//Имя массива нельзя использовать в левой
//части оператора присваивания.
//Ошибка приводит к сбою на этапе компиляции

10. Строки в С++

Примеры неверных присваиваний.
Пример 2.
char str1[10]= "Hello";char* str2;str2=str1;str2[1]='u';
// Возможно имеется идеологическая ошибка. Неправильно
полагать, что в str2 теперь содержится копия str1. Указатель
указывает не на копию, а на ту же самую строку. При любом
изменении содержимого str2 изменяется str1.

11. Строки в С++

Особенности ввода/вывода строк
Строку можно присвоить массиву, используя операцию cin — взять
из потока. Из потока считываются символы пока не встретится
пробел, символ табуляции, символ новой строки или указатель
конца файла.
Пример:
char str[10];
cin>>str;
При этом длина вводимой строки не может быть более 9 символов,
чтобы оставить место для завершающего нулевого символа.

12. Строки в С++

Для ввода строк, состоящих из нескольких слов, в одну строковую
переменную, используют методы getline или get класса istream.
cin.get(char *_Str, int _Count, char _Delim);
cin.getline(char *_Str, int _Count, char _Delim);
где:
_Count – количество считываемых символов.
_Delim – символ разделитель, останавливающий ввод, если он
встретится до того как будет введено _Count-1 символов. По
умолчанию он равен ‘\n’. Символ разделитель удаляется.
_Str – строка, в которую записываются считываемые символы.

13. Строки в С++

Пример 1:
#include <iostream>;
#include <conio.h>;
using namespace std;
void main() {
char str[10];
cin.getline(str,10);
cout << str;
_getch();
}

14. Строки в С++

Пример 1_1:
#include <iostream>;
#include <conio.h>;
using namespace std;
void main() {
char str[10];
cin.get(str,10);
cout << str;
_getch();
}

15. Строки в С++

Удобным способом определить размер массива является
использование оператора C++ sizeof:
сin.getline(str, sizeof(str));
Пример 2:
#include <iostream>;
#include <conio.h>;
using namespace std;
void main() {
char str1[10], str2[10], str3[10];
cin.get(str1,10);
cout << "str1: " << str1 << endl;
cin.get(str2,sizeof(str2));
cout << "str2: " << str2 << endl ;
cin.get(str3,sizeof(str3));
cout << "str3" << str3 << endl ;
_getch();
}

16. Строки в С++

Результат работы программы
При первом вызове функции get() для второго параметра
установлено значение 10, третий параметр по умолчанию
устанавливается как символ разрыва строки (\n).
Если символ разрыва строки (\n) повстречается раньше, чем будет
введен последний допустимый символ строки, функция вставит в
этом месте концевой нулевой символ, но символ разрыва строки
при этом останется в буфере и будет считан очередной функцией
ввода.

17.

Результат работы программы
5.
6.
7.
8.
9.
10.
11.
char str1[10], str2[10], str3[10];
cin.get(str1,10);
cout << "str1: " << str1 << endl;
cin.get(str2,sizeof(str2));
cout << "str2: " << str2 << endl ;
cin.get(str3,sizeof(str3));
cout << "str3" << str3 << endl ;
Буфер
1-я стр\n
str1
get(str1,10)
1 - я
с т р \0
\n

18.

Результат работы программы
5.
6.
7.
8.
9.
10.
11.
char str1[10], str2[10], str3[10];
cin.get(str1,10);
cout << "str1: " << str1 << endl;
cin.get(str2,sizeof(str2));
cout << "str2: " << str2 << endl ;
cin.get(str3,sizeof(str3));
cout << "str3" << str3 << endl ;
Буфер
str2
\n
get(str2,10)
\0
\n

19.

Результат работы программы
5.
6.
7.
8.
9.
10.
11.
char str1[10], str2[10], str3[10];
cin.get(str1,10);
cout << "str1: " << str1 << endl;
cin.get(str2,sizeof(str2));
cout << "str2: " << str2 << endl ;
cin.get(str3,sizeof(str3));
cout << "str3" << str3 << endl ;
Буфер
str3
\n
get(str3,10)
\0
\n

20.

Результат работы программы
5.
6.
7.
8.
9.
10.
11.
char str1[10], str2[10], str3[10];
cin.get(str1,10);
cout << "str1: " << str1 << endl;
cin.get(str2,sizeof(str2));
cout << "str2: " << str2 << endl ;
cin.get(str3,sizeof(str3));
cout << "str3" << str3 << endl ;
если введено более 9-ти
символов, то функция get()
оборвет ввод строки после
прочтения из буфера 9
символов, после чего добавит
концевой нулевой символ (\0).
При этом остальные введенные
символы остаются в буфере
Буфер
1-я стр содержит > 9 символов\n
str1
get(str1,10)
1 - я
с т р
с \0
одержит > 9 символов\n

21.

Результат работы программы
5.
6.
7.
8.
9.
10.
11.
char str1[10], str2[10], str3[10];
cin.get(str1,10);
cout << "str1: " << str1 << endl;
cin.get(str2,sizeof(str2));
cout << "str2: " << str2 << endl ;
cin.get(str3,sizeof(str3));
cout << "str3" << str3 << endl ;
Буфер
1-я стр содержит > 9 символов\n
str1
get(str1,10)
1 - я
с т р
с \0
одержит > 9 символов\n
Буфер
одержит > 9 символов\n
str2
get(str2,10)
о д е р ж и т
> \0
9 символов\n

22.

5.
6.
7.
8.
9.
10.
11.
char str1[10], str2[10], str3[10];
cin.get(str1,10);
cout << "str1: " << str1 << endl;
cin.get(str2,sizeof(str2));
cout << "str2: " << str2 << endl ;
cin.get(str3,sizeof(str3));
cout << "str3" << str3 << endl ;
Буфер
1-я стр содержит > 9 символов\n
str1
get(str1,10)
1 - я
с т р
с \0
одержит > 9 символов\n
Буфер
одержит > 9 символов\n
str2
get(str2,10)
о д е р ж и т
> \0
9 символов\n
Буфер
9 символов\n
str3
get(str3,10)
9
с и м в о л \0
ов\n

23.

5.
char str1[10], str2[10], str3[10];
6.
7.
8.
9.
10.
11.
cin.get(str1,10);
cout << "str1: " << str1 << endl;
cin.get(str2,sizeof(str2));
cout << "str2: " << str2 << endl ;
cin.get(str3,sizeof(str3));
cout << "str3" << str3 << endl ;
Для очистки буфера, перед вызовом функции get() будем
вызывать функцию ignore()
Функция ignore() определена в классе istream:
istream& istream::ignore(streamsize n=1, int delim=EOF);
Эта функция извлекает из потока и отбрасывает: либо
streamsize символов (по умолчанию n=1), либо все символы,
пока в потоке не встретится символ, заданный параметром
delim.

24.

Пример 2_1
1. #include <iostream>;
2. #include <conio.h>;
3. using namespace std;
4. void main() {
5.
char str1[10], str2[10], str3[10];
6.
cin.get(str1,10);
7.
cout << "str1: " << str1 << endl;
8.
cin.ignore(255,'\n');
9.
cin.get(str2,sizeof(str2));
10. cout << "str2: " << str2 << endl ;
11. cin.ignore(cin.rdbuf() -> in_avail());
12. cin.get(str3,sizeof(str3));
13. cout << "str3: " << str3 << endl ;
14. _getch();
15. }
В строке 8 мы
указали количество
символов (255),
которое, как мы
полагаем, может
находиться в буфере.

25.

Пример 2_1
1. #include <iostream>;
2. #include <conio.h>;
3. using namespace std;
В строке 11 в
4. void main() {
качестве первого
5.
char str1[10], str2[10], str3[10];
параметра функции
ignore() указано
6.
cin.get(str1,10);
значение
7.
cout << "str1: " << str1 << endl;
соответствующее
8.
cin.ignore(255,'\n');
размеру буфера.
9.
cin.get(str2,sizeof(str2));
10. cout << "str2: " << str2 << endl ;
11. cin.ignore(cin.rdbuf() -> in_avail());
12. cin.get(str3,sizeof(str3));
13. cout << "str3: " << str3 << endl ;
14. _getch();
15. }

26.

streambuf* istream::rdbuf() const;
streamsize streambuf::in_avail();
Функция rdbuf()возвращает указатель на строковый
буфер для текущего строкового потока.
Функция in_avail(), принадлежащая классу streambuf,
возвращает количество символов, содержащихся в
буфере.
Вызов функции
cin.ignore(cin.rdbuf()->in_avail());
позволит очистить буфер от содержащихся в нем
символов.

27.

Cтроку
cin.ignore(cin.rdbuf()->in_avail());
можно так же записать в виде
cin.ignore(numeric_limits<streamsize>::max(),'\n');
В этом случае в качестве первого параметра функции ignore()
указано значение соответствующее размеру буфера.
Класс numeric_limits описывает арифметические свойства
встроенных числовых типов.
numeric_limits<тип>::max — Возвращает максимально
допустимое конечное значение для типа, указанного в
треугольных скобках. Например, numeric_limits<int>::max()
возвращает максимально допустимое значение типа int.

28.

Пример 2_1
#include <iostream>;
#include <conio.h>;
using namespace std;
void main() {
char str1[10], str2[10], str3[10];
cin.getline(str1,10);
cout << "str1: " << str1 << endl;
cin.getline(str2,sizeof(str2));
cout << "str2: " << str2 << endl ;
cin.getline(str3,sizeof(str3));
cout << "str3: " << str3 << endl ;
_getch();
}

29.

Пример 2_1
#include <iostream>;
#include <conio.h>;
using namespace std;
void main() {
char str1[10], str2[10], str3[10];
cin.getline(str1,10);
cout << "str1: " << str1 << endl;
cin.getline(str2,sizeof(str2));
cout << "str2: " << str2 << endl ;
cin.getline(str3,sizeof(str3));
cout << "str3: " << str3 << endl ;
_getch();
}

30.

cin.getline(str1,10);
cout << "str1: " << str1 << endl;
cin.getline(str2,sizeof(str2));
cout << "str2: " << str2 << endl ;
cin.getline(str3,sizeof(str3));
cout << "str3: " << str3 << endl ;
Здесь программа прекращает выполнение при попытке
ввода данных. Если функция getline извлекает
str.max_size элементов, то она вызывает функцию
SetState (ios_base :: failbit). Функция setstate(state)
устанавливает флаги, содержащиеся в state.

31.

Состояния потока и их значения (фаги)
Состояние
Значение
Goodbit
Ошибок нет
Eofbit
Достигнут конец файла
Failbit
Имеет место ошибка форматирования или
преобразования
Badbit
Имеет место серьезная ошибка

32.

Функции для работы с состоянием потока данных
Функция
Описание
good()
Возвращает true, если поток данных находится в
нормальном состоянии (то есть при установке флага
goodbit)
eof()
Возвращает true при обнаружении признака конца
файла (установка флага eofbit)
fail()
Возвращает true при обнаружении ошибки (установка
флага failbit или badbit)
bad()
Возвращает true при обнаружении фатальной ошибки
(установка флага badbit)
rdstate()
Возвращает установленные флаги
clear()
Сбрасывает все флаги
clear(state)
Сбрасывает все флаги и устанавливает флаги,
содержащиеся в state
setstate(state)
Устанавливает флаги, содержащиеся в state

33.

При вызове функции clear() без параметров
сбрасываются все флаги ошибок (в том числе и eofbit):
// Сброс всех флагов ошибок
(включая eofbit) strm.clear();
Если функция clear() вызывается с передачей
параметра, то состояние потока данных изменяется в
соответствии с переданным значением; переданные
флаги устанавливаются для потока данных, а остальные
флаги сбрасываются.
У этого правила есть единственное исключение: при
отсутствии потокового буфера (когда rdbuf()==0) флаг
badbit устанавливается всегда.

34.

Для того чтобы осуществить ввод следующей строки с
помощью функции getline() необходимо сбросить флаг и
очистить буфер. Очистка буфера может быть
осуществлена, например, с помощью функции
fflush(stdin).
int fflush(FILE *stream) —
Если stream связан с файлом, открытым для записи, то
вызов fflush() приводит к физической записи содержимого
буфера в файл. Если же stream указывает на вводимый
файл, то очищается входной буфер. В обоих случаях
файл остается открытым.
Возврат 0 означает успех, а возврат ненулевой величины
указывает на наличие ошибки по записи.

35.

Пример 3
#include <iostream>;
#include <conio.h>;
using namespace std;
void main() {
char str1[10], str2[10], str3[10];
cin.getline(str1,10);
cout << "str1: " << str1 << endl;
cin.clear();
fflush(stdin);
cin.getline(str2,sizeof(str2));
cout << "str2: " << str2 << endl ;
cin.clear();
fflush(stdin);
cin.getline(str3,sizeof(str3));
cout << "str3: " << str3 << endl ;
_getch();
}

36.

Альтернативные функции ввода-вывода данных
Если нужно считать в буфер определенное количество
символов, не разбираясь, есть ли там переводы строк
или нет, то следует воспользоваться функцией
read(),
а затем с помощью другой функции,
gcount(),
определить, сколько именно символов удалось
прочесть:

37.

Пример
char buf[1024];
int chars_read;
cin.read(buf, sizeof(buf));
chars_read = cin.gcount();
Функции
put()
для вывода одного символа;
write() запишет в выходной поток sizeof(buf)
символов.

38.

Функции работы с символами
Прототип функция
int isdigit(int c);
int isalpha(int c);
int isanum(int c);
int isxdigit(int c);
int islower(int c);
Описание
Возвращает true (не 0), если c является
цифрой и false (0) в других случаях
Возвращает true (не 0), если c является
буквой и false (0) в других случаях
Возвращает true (не 0), если c является
цифрой или буквой и false (0) в других
случаях
Возвращает true (не 0), если c является
одним из символов шестнадцатеричного
формата и false (0) в других случаях
Возвращает true (не 0), если c является
буквой нижнего регистра и false (0) в
других случаях

39.

Функции работы с символами
int isupper(int c); Возвращает true (не 0), если c является буквой
верхнего регистра и false (0) в других случаях
int tolower(int c); Если c является буквой верхнего регистра, то
функция возвращает c как букву нижнего
регистра. В других случаях аргумент не меняется
int toupper(int c); Если c является буквой нижнего регистра, то
функция возвращает c как букву верхнего
регистра. В других случаях аргумент не меняется
int isspace(int c); Возвращает true (не 0), если c является
пробельным символом: ‘ ’,’\n’,’\t’,’\f’,’\r’,’\v’
int iscntrl(int c); Возвращает true (не 0), если c является
управляющим символом
int ispunct(int c); Возвращает true (не 0), если c является
отображаемым при печати символом, исключая
пробел

40.

Функции работы со строками
Функция
Описание
сhar *strcpy(char
Копирует строку s2 в массив символов s1.
*s1,const char *s2); Возвращает значение s1.
сhar *strncpy(char
Копирует не более n символов из строки s2 в
*s1,const char
массив символов s1. Возвращает значение s1.
*s2,size_t n);
сhar *strcat(char
Добавляет строку s2 к строке s1. Первый
*s1,const char *s2); символ строки s2 записывается поверх
завершающего нулевого символа строки s1.
Возвращает значение s1.
сhar *strncat(char
Добавляет не более n символов строки s2 в
*s1,const char *s2, строку s1. Первый символ строки s2
size_t n);
записывается поверх завершающего нулевого
символа строки s1. Возвращает значение s1.

41.

Функции работы со строками
Функция
int strcmp(const
char *s1,const char
*s2);
int strncmp(const
char *s1,const char
*s2, size_t n);
Описание
Сравнивает строки s1 и s2. Функция возвращает 0, если
строки равны; значение меньше 0, если s1 меньше s2 и
значение больше 0, если s1 больше s2.
Сравнивает до n символов строк s1 и s2. Функция
возвращает 0, если строки равны; значение меньше 0,
если s1 меньше s2 и значение больше 0, если s1
больше s2.
Последовательность вызовов strtok разбивает строку
сhar *strtok(char
*s1,const char *s2); s1 на лексемы – логические части, такие как слова,
разделенные символами, содержащимися в строке s2.
Первый вызов содержит в качестве первого аргумента
s1, а последующие вызовы для той же строки,
содержат в качестве первого аргумента null. При
каждом вызове возвращается указатель на текущую
лексему. Если лексем больше нет возвращается null.

42.

Функции работы со строками
Функция
size_t strlen(const
char *s);
Описание
Определяет длину строки s. Возвращает количество
символов, предшествующих завершающему
нулевому символу.
Находит позицию первого вхождения символа c в
char *strchr(const
строку s. Если c найден, функция возвращает
char *s,int c);
указатель на c в строке s, иначе возвращается NULL.
size_t strcspn(cons Определяет и возвращает длину начального
сегмента строки s1, содержащего только те символы,
t char *s1, const
которые не входят в s2.
char *s2);
char * strpbrk(const Находит в строке s1 позицию первого вхождения
char *s1, const char любого из символов строки s2. Если символ из
строки найден, возвращается указатель на этот
*s2);
символов строке s1, иначе возвращается NULL.

43.

Функции работы со строками
Функция
Описание
char * strrchr(const Находит позицию последнего вхождения
char *s, int c);
символа c в строку s. Если c найден, функция
возвращает указатель на этот символ, иначе
возвращается NULL.
char * strstr(const Находит позицию первого вхождения строки s2
char *s1, const char в строку s1. Если подстрока найдена, функция
*s2);
возвращает указатель подстроки в строке s1,
иначе возвращается NULL.

44.

Пример 4
Дана строка символов. Составить программу, которая
подсчитывает, сколько раз среди данных символов встречается
пробел.
#include <iostream>;
#include <conio.h>;
using namespace std;
void main() {
char strR[255], ch;
int k=0;
cout << "vvedite stroku \n";
cin.get(strR,sizeof(strR));
for (int i=0;i<=strlen(strR);i++)
if (strR[i]==' ') k++;
cout << "v stroke \"" << strR << "\" sodergitsja "<<k<<
" probelov"<<endl;
_getch();
}

45.

#include <iostream>;
#include <conio.h>;
using namespace std;
void main() {
char strR[255], ch;
int k=0;
cout << "vvedite stroku \n";
cin.get(strR,sizeof(strR));
for (int i=0;i<=strlen(strR);i++)
if (strR[i]==' ') k++;
cout << "v stroke \"" << strR << "\" sodergitsja "<<k<<
" probelov"<<endl;
_getch();
}

46.

Пример 5
Дана строка символов и слово. Составить программу, которая
после каждого слова этой строки, введенное слово.
//копирование первого слова в новую переменную
//в исходной переменной оставляем все слова кроме первого.
#include <iostream>;
#include <conio.h>;
using namespace std;
void main() {
char str1[255], s[40];
cout << "vvedite stroku \n";
cin.get(str1,sizeof(str1));
s[0]='\0';
if (strcspn(str1," ")!=NULL)
strncat(s,str1,strcspn(str1," "));
strcpy(str1,strchr(str1,' ')+1);
cout << "stroka1:”<< str1 <<" str2:"<<s<<endl;
_getch();
}

47.

Пример 5
Дана строка символов и слово. Составить программу, которая
после каждого слова этой строки, введенное слово.
//копирование первого слова в новую переменную
//в исходной переменной оставляем все слова кроме первого.
#include <iostream>;
size_t strcspn(const char
#include <conio.h>;
*s1, const char *s2);
using namespace std;
Определяет и возвращает
void main() {
длину начального сегмента
строки s1, содержащего
только те символы, которые
не входят в s2.
char str1[255], s[40];
cout << "vvedite stroku \n";
cin.get(str1,sizeof(str1));
s[0]='\0';
if (strcspn(str1," ")!=NULL)
strncat(s,str1,strcspn(str1," "));
strcpy(str1,strchr(str1,' ')+1);
cout << "stroka1:”<< str1 <<" str2:"<<s<<endl;
_getch();
}

48.

Пример 5
Дана строка символов и слово. Составить программу, которая
после каждого слова этой строки, введенное слово.
//копирование первого слова в новую переменную
//в исходной переменной оставляем все слова кроме первого.
#include <iostream>;
сhar *strncat(char *s1,const
#include <conio.h>;
char *s2, size_t n);
using namespace std;
Добавляет не более n
void main() {
символов строки s2 в строку
s1. Первый символ строки s2
записывается поверх
завершающего нулевого
символа строки s1.
Возвращает значение s1.
char str1[255], s[40];
cout << "vvedite stroku \n";
cin.get(str1,sizeof(str1));
s[0]='\0';
if (strcspn(str1," ")!=NULL)
strncat(s,str1,strcspn(str1," "));
strcpy(str1,strchr(str1,' ')+1);
cout << "stroka1:”<< str1 <<" str2:"<<s<<endl;
_getch();
}

49.

Пример 5
Дана строка символов и слово. Составить программу, которая
после каждого слова этой строки, введенное слово.
//копирование первого слова в новую переменную
//в исходной переменной оставляем все слова кроме первого.
#include <iostream>;
сhar *strcpy(char *s1,const
#include <conio.h>;
char *s2);
using namespace std;
Копирует строку s2 в массив
void main() {
символов s1. Возвращает
значение s1.
char str1[255], s[40];
cout << "vvedite stroku \n";
cin.get(str1,sizeof(str1));
s[0]='\0';
if (strcspn(str1," ")!=NULL)
strncat(s,str1,strcspn(str1," "));
strcpy(str1,strchr(str1,' ')+1);
cout << "stroka1:”<< str1 <<" str2:"<<s<<endl;
_getch();
}

50.

//копирование первого слова в новую переменную
//в исходной переменной оставляем все слова кроме первого.
#include <iostream>;
#include <conio.h>;
using namespace std;
void main() {
char str1[255], s[40];
cout << "vvedite stroku \n";
cin.get(str1,sizeof(str1));
s[0]='\0';
сhar *strncat(char *s1,const
char *s2, size_t n);
Добавляет не более n
символов строки s2 в строку
s1. Первый символ строки
s2 записывается поверх
завершающего нулевого
символа строки s1.
Возвращает значение s1.
if (strchr(str1,' ')!=NULL)
strncat(s,str1,strcspn(str1," "));
strcpy(str1,strchr(str1,' ')+1);
cout <<"stroka1:"<<str1 <<"str2:"<<s<<endl;
_getch();
}

51.

//копирование первого слова в новую переменную
//в исходной переменной оставляем все слова кроме первого.
#include <iostream>;
#include <conio.h>;
using namespace std;
void main() {
char str1[255], s[40];
сhar *strcpy(char
cout << "vvedite stroku \n"; *s1,const char *s2);
Копирует строку s2 в
cin.get(str1,sizeof(str1));
массив символов s1.
s[0]='\0';
Возвращает значение s1.
if (strchr(str1,' ')!=NULL)
strncat(s,str1,strcspn(str1," "));
strcpy(str1,strchr(str1,' ')+1);
cout <<"stroka1:"<<str1 <<"str2:"<<s<<endl;
_getch();
}

52.

//копирование первого слова в новую переменную
//в исходной переменной оставляем все слова кроме первого.
#include <iostream>;
#include <conio.h>;
using namespace std;
void main() {
size_t strcspn(const
char *s1, const char *s2);
Определяет и
возвращает длину
начального сегмента
строки s1, содержащего
только те символы,
которые не входят в s2.
char str1[255], s[40];
cout << "vvedite stroku \n";
cin.get(str1,sizeof(str1));
s[0]='\0';
if (strchr(str1,' ')!=NULL)
strncat(s,str1,strcspn(str1," "));
strcpy(str1,strchr(str1,' ')+1);
cout <<"stroka1:"<<str1 <<"str2:"<<s<<endl;
_getch();
}

53.

//копирование первого слова в новую переменную
//в исходной переменной оставляем все слова кроме первого.
#include <iostream>;
#include <conio.h>;
using namespace std;
void main() {
char *strchr(const char
*s,int c);
Находит позицию первого
вхождения символа c в
строку s. Если c найден,
функция возвращает
указатель на c в строке s,
иначе возвращается NULL.
char str1[255], s[40];
cout << "vvedite stroku \n";
cin.get(str1,sizeof(str1));
s[0]='\0';
if (strchr(str1,' ')!=NULL)
strncat(s,str1,strcspn(str1," "));
strcpy(str1,strchr(str1,' ')+1);
cout <<"stroka1:"<<str1 <<"str2:"<<s<<endl;
_getch();
}

54.

//копирование первого слова в новую переменную
//в исходной переменной оставляем все слова кроме первого.
#include <iostream>;
#include <conio.h>;
using namespace std;
void main() {
char str1[255], s[40];
cout << "vvedite stroku \n";
cin.get(str1,sizeof(str1));
s[0]='\0';
if (strchr(str1,' ')!=NULL)
strncat(s,str1,strcspn(str1," "));
strcpy(str1,strchr(str1,' ')+1);
cout <<"stroka1:"<<str1 <<"str2:"<<s<<endl;
_getch();
}

55.

#include <iostream>;
#include <conio.h>;
using namespace std;
void main() {
char str1[255], str2[20], s[40];
cout << "vvedite stroku \n";
cin.get(str1,sizeof(str1));
cout << "vvedite slovo \n";
cin.get(str2,sizeof(str2));
s[0]='\0';
if (strcspn(str1," ")!=NULL) {
strncat(s,str1,strcspn(str1," "));
strcat(s," "); strcat(s,str2); strcat(s," ");
strcpy(str1,strchr(str1,' ')+1);
}
cout << "stroka1:" << str1 << " str2:"<<s<<endl;
_getch();
}

56.

#include <iostream>;
#include <conio.h>;
using namespace std;
void main() {
char str1[255], str2[20], s[40];
cout << "vvedite stroku \n";
cin.get(str1,sizeof(str1));
cin.ignore(255,'\n');
cout << "vvedite slovo \n";
cin.get(str2,sizeof(str2));
cin.ignore(255,'\n');
s[0]='\0';
while (strchr(str1,' ')!=NULL)
if (strchr(str1,' ')!=NULL) {
strncat(s,str1,strcspn(str1," "));
strcat(s," "); strcat(s,str2); strcat(s," ");
strcpy(str1,strchr(str1,' ')+1);
cout << "stroka1:" << str1 << " str2:"<<s<<endl;
}
strcat(s,str1);
cout << "stroka1:" << str1 << " str2:"<<s<<endl;
_getch();
}

57.

#include <iostream>;
#include <conio.h>;
using namespace std;
void main() {
char str1[255], str2[20], s[40];
cout << "vvedite stroku \n";
cin.get(str1,sizeof(str1));
cin.ignore(255,'\n');
cout << "vvedite slovo \n";
cin.get(str2,sizeof(str2));
cin.ignore(255,'\n');
s[0]='\0';
while (strchr(str1,' ')!=NULL)
if (strchr(str1,' ')!=NULL) {
strncat(s,str1,strcspn(str1," "));
strcat(s," "); strcat(s,str2); strcat(s," ");
strcpy(str1,strchr(str1,' ')+1);
cout << "stroka1:" << str1 << " str2:"<<s<<endl;
}
strcat(s,str1);
cout << "stroka1:" << str1 << " str2:"<<s<<endl;
_getch();
}

58. Строки в C++.

Задания для самостоятельной работы
60. Составьте программу, которая запрашивает имя человека и выводит на
экран это имя с приветствием.
61. Дана строка, состоящая не менее чем из двух символов. Составьте
программу, которая выводит на экран предпоследний символ.
62. Даны натуральное число n и строка символов. Составьте программу,
которая определяет, верно ли, что в строке имеются n подряд идущих
пробелов.
63. Даны натуральное число n и строка символов. Составьте программу,
которая копирует первые n символов из исходной строки в новую. Если n
больше длины строки, то строка копируется целиком.
64. Дана строка символов, содержащая слова, то есть
группы символов, разделенные пробелами (не менее одного). Составьте
программу, которая определяет, сколько начальных букв первого слова
совпадает с начальными буквами второго слова.
65. Дана строка символов. Составьте программу, которая исключает из
строки группы символов, расположенные между скобками, например,
круглыми. Скобки тоже исключить. Предполагается, что внутри пары скобок
других скобок нет.

59. Лекция 8. Строки в C++.

Задания для самостоятельной работы
66. Дана строка символов, содержащая слова, то есть группы символов,
разделенные пробелами (не менее одного). Составьте программу,
которая находит длину самого короткого слова..
67. Дана строка символов. Составьте программу, которая выясняет,
верно ли, что в данной строке больше букв, чем цифр.
68. Дана строка символов, состоящая из n (n>=20) символов. Составьте
программу, которая переставляет в обратном порядке символы,
расположенные между k-й и m-й буквами. Значения k и m вводятся с
клавиатуры (k<s<n).
69. Дана строка символов, содержащая слова, то есть группы символов,
разделенные пробелами (не менее одного). Составьте программу,
которая выводит на экран все слова, встречающиеся в исходной
строке ровно один раз.
70. Даны строки символов. Составьте программу, которая определяет,
можно ли из символов первой строки составить вторую строку.

60. Лекция 8. Строки в C++.

Задания для самостоятельной работы
71. На вход программы подаются сведения о набранных на ЕГЭ баллах учениками
данной школы по трём предметам. В первой строке сообщается количество
учащихся N (N<100), каждая из следующих N строк имеет формат: <Фамилия>
<Инициалы> <БаллыПоРусскомуЯзыку> <БаллыПоМатематике>
<БаллыПоИнформатике>, где <Фамилия> -- строка, состоящая не более чем из 20
символов, <Инициалы> --- строка, состоящая из 4-х символов (буква, точка, буква,
точка), <БаллыПоРусскомуЯзыку>, <БаллыПоМатематике>,
<БаллыПоИнформатике> --- целые числа в диапазоне от 0 до 100. Все элементы
одной строки отделены друг от друга пробелом.
Пример входной строки:
Петров С.Н. 78 82 70
Требуется написать как можно более эффективную программу, которая
будет выводить на экран фамилии и инициалы учеников, набравших
максимальную сумму баллов по трём предметам (таких учеников может
быть несколько), а также набранную ими сумму баллов.
English     Русский Правила