Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C++.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.47 Mб
Скачать

Поделиться в соц. Сетях

C++. Урок 10. Строки

Опубликовано 01.12.2012 автором admin

Вот мы и дошли до 10 урока. Его темой, как я и обещал, будут строки.

Фактически, строка (далее string) — это массив типа char. Но есть несколько отличий:

1) String - это динамический массив символов, т.е. ему не надо задавать начальный размер:

1

2

3

4

char   a [1000];

// создание массива char длиной в 1000

string a;

// создание string-a, с динамичной длиной

2) String можно вводить просто одним cin-ом:

1

2

3

4

5

6

7

8

9

char ch, a[1000000];

int n;

while (cin >> ch)

 a[n++] = ch;

// создание и ввод массива символов

 

string s;

cin >> s;

// создание и ввод string-a

3) String можно вводить до пробела, или до конца строки:

1

2

3

4

5

cin >> s;

// ввод string-a до пробельного символа

 

getline (cin, s);

// считывание всей строки

Т.е. при использовании cin, все введенный вами символы будут записываться в string пока вы не нажметепробел. Если же вы используете getline символы будут записываться пока вы не нажмете enter.

4) String можно приравнивать, сравнивать, складывать и.т.д:

1

2

3

4

5

6

7

8

9

string a, b, c, d, s;

cin >> a >> b;

c = a;

d = b;

s = a + b;

cout << s << "\n";

if (c == d) cout << "Equal! \n";

if (c < d) cout << "First string is lexicographically smaller than second one \n";

if (c > d) cout << "Second string is lexicographically smaller than first one \n";

Заметьте, что при сравнении двух строк меньшей будет та, которая меньше лексикографически, т.е. в алфавитном порядке. Пример лексикографически отсортированного по возрастанию набора слов:

a, abcdefg, abscissa, b, bbb, bbbbb, bulvar, bulvara, grajdanstvo, zub, zubnoy.

При сложении двух строк, в конец первой строки будет записана вторая строка.

5) Для присваивания значения string-у используются кавычки («»):

1

2

3

4

5

6

7

8

9

char a[5] = {'0', '1', '2', '3', '4'};

for (int i = 0; i < 5; ++i)

 cout << a[i];

cout << "\n";

// присваивание и вывод массива символов

 

string s = "01234";

cout << s << "\n";

// присваивание и вывод string-a

С различиями вроде все. Но главная особенность string-а в том, что в STL (Standard Template Library, или стандартная библиотека шаблонов) для него припасено много полезных функций:

1)  string.size()

Возвращает размер string-a, а именно количество символов в нем. Стоит упомянуть, что символы в string-е пронумерованы начиная с нуля.

1

2

3

string user_name;

cin >> user_name;

cout << user_name.size() << "\n" << s << "\n";

2) string.empty()

Возвращает true, если string пуст.

1

2

3

4

5

6

string str;

cin >> str;

if (str.empty() == true)

 cout << "Error! Empty filename! \n";

else

 cout << "Success! \n";

3) string.clear()

Очищает строку, т.е. string.size() становится нулем, а string.empty() будет возвращать true.

1

2

3

4

5

string s;

cin >> s;

cout << s;

s.clear();

cin >> s;

4) string.push_back (char)

Добавляет в конец строки char-овский символ.

1

2

3

4

5

char ch;

string str;

whlie (cin >> ch)

 str.push_back(ch);

cout << str;

5) string.insert (int start1, string from, int start2, int amount)

Вставляет в строку начиная с позиции start1amount символов, начиная со start2, из строки fromТ.е. написав:

1

str.insert (6, name, 17, 3);

мы вставив в строку str, начиная с ячейки 6, символы из строки name с номерами 17, 18 и 19.

1

2

3

4

5

6

7

string a = "to be", b = "or not", c = "that is", d = "the question!", s;

s.insert (0, a, 0, a.size());

s.insert (s.size() - 1, b, 0, b.size());

s.insert (s.size() - 1, a, 0, 5);

s.insert (s.size() - 1, c, 0, c.size());

s.insert (s.size() - 1, d, 0, d.size());

cout << s;

6) string.erase (int from, int amount)

Стирает из строки amount символов, начиная с ячейки from.

1

2

3

string s = "a shot in the dark";

s.erase (2, 1);

cout << s;

7) string.reverse (int from, int to)

Перевернет строку начиная с ячейки from до ячейки to (to не включительно).

1

2

3

string a = "sator arepo tenet opera rotas";

a.reverse (0, a.size());

cout << a;

Итог: 

Так получилось, что я сижу и нахваливаю string и всячески показываю его преимущества перед массивом char. Надо это исправить.

+ массива символов:

  • Работает заметно быстрее, чем string.

  • Потребляет меньше памяти.

  • Имеется способ считывания массива вместе с пробельными символами, с помощью функции gets():

1

2

3

4

char str[100];

gets (str);

cout << strlen(str) << " " << str << "\n";

// длина массива, сам массив

- массива символов:

  • Нету STL-овских функций.

+ строки:

  • Удобное считывание файлов.

  • Наличие множества полезных функций предназначенных для string.

- строки:

  • Медленная скорость работы и большое потребление памяти

  • Иногда, при изменении строки без специальных функций, целостность строки разрушается и ее нельзя вывести простым cout-ом.

У-ф-ф. Вроде на этом все. Спасибо за прочтение. Следующий урок будет о текстовом вводе выводе.

C++. Урок 11. Файловый ввод-вывод.

Опубликовано 13.12.2012 автором admin

Всем доброго дня!

До этого мы уже затрагивали тему ввода-вывода. И это было простой консолью. Теперь мы поговорим офайловом вводе-выводе.

Что из себя представляет эта тема понятно уже по названию, но все же… :

Файловый ввод-вывод позволяет считывать данные из множества различных файлов, и выводить их в другие (или те же) файлы .

Итак, для считывания файлов можно использовать функцию freopen, которая позволяет перенаправлять потоки ввода-вывода. Ввод всегда идет в поток stdin, вывод же в stdout. Теперь о том, как пользоватьсяfreopen-ом:

1

freopen ("имя файла", "мод", "имя потока");

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]