- результате на экран будут выведены еще три пустые строки, а символ ‘\n’ так и останется во входном потоке. Это символ надо удалить из потока путем вызова get без параметров.
-
Метод getline после прочтения строки не оставляет во входном потоке символ ‘\n’ , поэтому лучше пользоваться им.
10
Строки
-
Способы ввода/вывода строк :
-
С использованием функций ввода/вывода языка С
-
#include <stdio.h>
-
int main()
-
{ const int n = 80;
-
char s[n];
-
gets(s); puts(s);
-
}
-
#include <stdio.h>
-
int main()
-
{ const int n = 80;
-
int a; float b;
-
char s[n];
-
puts(" s : "); gets(s);
-
printf("a = "); scanf("%d",&a);
-
printf("b = "); scanf("%f",&b);
-
printf("%2d%25s%5.1f\n",a,s,b);
-
}
11
Строки
-
Очень удобный способ ввода-вывода строк – использование функций языка С gets и puts.
-
Вывод при помощи функции printf удобнее использовать в том случае, если в одном операторе требуется вывести данные различных типов. Если же работа выполняется только со строками, то следует использовать puts.
12
Строки
-
Основные библиотечные функции для обработки строк в стиле С ( объявлены в файле string.h).
-
unsigned strlen(char* s)
-
int *strcmp(char* s1, char* s2)
-
char *strchr(char* s, int ch)
-
char* strstr(char* s1 char* s2)
-
char* strcpy(char* s1, char* s2)
-
char* strcat(char* s1, char* s2)
-
char* strtok(char* s1, char* s2)
13
Строки
-
Использование функций копирования
-
#include <iostream>
-
#include <string.h>
-
int main()
-
{ char x[]= "The string C++"; char y[50],z[15];
-
cout << " x : " << x << endl;
-
cout << " y : " << strcpy(y,x) << endl;
-
strncpy(z,x,10); z[10] = '\0';
-
cout << " z : " << z << endl;
-
}
14
Строки
-
Функция strcpy(y,x ) – копирует строку х в y, включая завершающий нулевой символ.
-
Функция strncpy(z, x, n) – копирует не более чем n символов массива x в z.
-
Если x – это строка длиной меньше, чем n, то в z дописывается нулевой символ столько раз, сколько нужно, чтобы общее количество скопированных символов равнялось n.
15
Строки
-
Использование функций объединения строк
-
#include <iostream>
-
#include <string.h>
-
int main()
-
{ char s1[50]= "C++ "; char s2[] = "in samples and tasks";
-
char s3[50]=" ";
-
cout << "s1 = " << s1 << endl << "s2 = " << s2 << endl;
-
cout << "strcat(s1,s2) = " << strcat(s1,s2) << endl;
-
cout << "strncat(s3,s1,14) = " << strncat(s3,s1,14) << endl;
-
}
16
Строки
-
Функция strcat(s1,s2 ) – добавление копии строки s2, включая завершающий нулевой символ, в конец строки s1. Начальный символ строки s2 записывается поверх нулевого символа в конец строки s1.
-
Функция strncat(s1, s2, n) – добавляет не более чем n символов массива s2 в конец строки s1.
17
Строки
-
Сравнение строк
-
#include <iostream>
-
#include <string.h>
-
int main()
-
{
-
cout << "\n Abc and Abc " << strcmp("Abc","Abc");
-
cout << "\n abc and Abc " << strcmp("abc","Abc");
-
cout << "\n abcd and abc " << strcmp("abcd","abc");
-
cout << "\n Abc and Abcd " << strcmp("Abc","Abcd");
-
cout << "\n abcd and abce " << strcmp("abcd","abce");
-
cout << "\n Abce and Abcd " << strncmp("Abce","Abcd",2);
-
cout << "\n Abc and abc " << stricmp("Abc","abc");
-
cout << "\n ABc and abd " << strnicmp("ABc","abd",2);
-
cout << endl;
-
}
18
Строки
-
Функция strcmp(s1,s2 ) – возвращает 0, если строки равны, отрицательное значение, если первая строка меньше, чем вторая, и положительное значение, если первая строка больше, чем вторая.
-
Функция strncmp(s1,s2 ) – используется для сравнения только первых n символов двух строк.
-
Функции stricmp(s1,s2 ) и strnicmp(s1,s2 ) используются для сравнения строк без учета регистра, т. е. без различия между прописными и строчными буквами.
19
Строки
-
Определение длины строки и разделение строки на лексемы (слова)
-
#include <iostream>
-
#include <string.h>
-
int main()
-
{ char string[]= "This sentence;has-5 words.";
-
char * tokenPtr;
-
cout << "\n string :" << endl << string;
-
cout << "\n length string :" << strlen(string);
-
cout << "\n words :" << endl;
-
tokenPtr = strtok(string, " ;-.");
-
while (tokenPtr != NULL)
-
{ cout << tokenPtr << endl;
-
tokenPtr = strtok(NULL," ;-.");
-
}
-
}
20
Строки
-
Рассмотрим пример определения длины строки и разбиения строки на лексемы (слова).
-
Функция strlen() возвращает длину строки (без учета символа завершения строки).
-
Для разбиения строки на лексемы (слова) используется последовательность вызовов функции strtok () .
-
Функция strtok () возвращает из строки string следующую лексему, отделенную любым разделителем.
-
tokenPtr – указатель, ссылающийся на следующий символ, начиная с которого должен осуществляться поиск следующей лексемы.
-
Каждый последующий вызов функции с нулевым указателем в качестве значения первого аргумента продолжает поиск лексем, начиная с того места в строке, на которое указывает возвращенное в результате последнего вызова значение указателя.
-
Функция strtok () возвращает нулевой указатель, если лексемы не обнаружены.
21
Строки
-
Библиотечные функции обработки символов (ctype.h)
22
Строки
23
Строки
24
Строки
-
Библиотечные функции преобразования строк (stdlib.h)
25
Строки
-
Функции поиска из библиотеки обработки строк (string.h)
26
Строки
-
Примеры использования функций поиска из библиотеки обработки строк (string.h)
-
#include <iostream>
-
#include <string.h>
-
using namespace std;
-
int main()
-
{ // использование strchr
-
char *str ="This is a text";
-
char ch1 = 's', ch2 = 'o';
-
cout << endl << "ch1 = " << ch1 << " ch2 = " << ch2 << endl;
-
if (strchr(str, ch1) != NULL)
-
cout << "ch1 is in " << "\"" << str << "\"" << endl;
-
else
-
cout << "ch1 is not in " << "\"" << str << "\"" << endl;
-
if (strchr(str, ch2) != NULL)
-
cout << "ch2 is in " << "\"" << str << "\"" << endl;
-
else
-
cout << "ch2 is not in " << "\"" << str << "\"" << endl;
-
}
27
Строки
-
Примеры использования функций поиска из библиотеки обработки строк (string.h)
-
#include <iostream>
-
#include <string.h>
-
using namespace std;
-
int main()
-
{ // использование strcspn и strspn
-
char *str1 = "The value is 3.14159";
-
char *str2 = "3.14159 is the value";
-
char *str3 = "1234567890";
-
cout <<endl <<"str1 = "<< str1 <<" str3 = " <<str3 << endl;
-
// длина начальной части строки str1, не содержащая
-
// символов из str2, равна
-
cout << " - " << strcspn(str1,str3) << endl;
-
cout <<endl <<"str2 = "<< str2 <<" str3 = " <<str3 << endl;
-
// длина начальной части строки str1, содержащая только
-
// символы из str2, равна
-
cout << " - " << strspn(str2,str3) << endl;
-
}
28
Строки
-
Примеры использования функций поиска из библиотеки обработки строк (string.h)
-
#include <iostream>
-
#include <string.h>
-
using namespace std;
-
int main()
-
{ char *str = "This is a text";
-
// использование strpbrk
-
char *str2 = "pink";
-
char *str3 = "is a";
-
cout <<endl <<"str = "<< str <<" str2 = " <<str2 << endl;
-
// среди символов строки str2 первый, встречающийся
-
// в строке str
-
cout << " - " << strpbrk(str,str2) << endl;
-
// использование strstr
-
cout <<endl <<"str = "<< str <<" str3 = " <<str3 << endl;
-
cout << " - " << strstr(str,str3) << endl;
-
}
29
Строки
-
Пример 1:
-
/* Дана строка символов, состоящая из слов. Слова разделяются пробелом. Удалить из строки все слова, начинающиеся с цифры.*/
-
#include <stdio.h>
-
#include <string>
-
#include <ctype.h>
-
using namespace std;
-
int main(void)
-
{ char s[250], //исходная строка
-
w[25], //слово
-
mas[10][25]; //массив слов
-
int k=0,t=0,i,len,j;
-
puts("\n Введите строку");
-
gets(s);
-
len = strlen(s);
30
Строки
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(!isdigit(mas[t][0])) //если символ не цифра
{ strcat(s,mas[t]); //копируем в строку слово
strcat(s," "); //копируем в строку пробел
}
puts(s); //выводим результат
}
31
Строки и функции
-
Задача: составить функцию, которая переставляет символы строки в обратном порядке.
-
Алгоритм:
-
определить длину строки ;
-
все символы первой половины строки переставить с соответствующими символами второй половины:
32
Строки и функции
-
Программа:
-
#include <conio.h>
-
#include <string>
-
using namespace std;
-
void Reverse ( char s[])
-
{ int len = strlen(s);
-
char c;
-
for ( int i = 0; i < len/2; i ++ )
-
{ c = s[i]; s[i] = s[len-i-1]; s[len-1-i] = c; }
-
}
-
int main()
-
{ char s[] = "0123456789";
-
Reverse(s); puts(s);
-
Reverse(s + 5); puts(s); // инверсия части строки
-
}
33
Строки и текстовые файлы
-
Функции ввода - вывода для посимвольной обработки текстовых файлов: