Опубликован: 02.02.2011 | Доступ: свободный | Студентов: 3373 / 985 | Оценка: 4.43 / 3.57 | Длительность: 33:06:00
Специальности: Программист
Лекция 8:

Символьные данные и строки

< Лекция 7 || Лекция 8: 123 || Лекция 9 >
Аннотация: В лекции рассматриваются понятия и определения символьных данных и строк, сходство и отличия их внутреннего представления, способы объявления, инициализация строк, методы доступа к элементам строк, определение размера строк, различные способы организации ввода/вывода символьных данных и строк.

Цель лекции: изучить особенности внутреннего представления символьных данных и строк, научиться выполнять ввод/вывод, просмотр и замену в строках при решении задач на языке C++.

Для представления текстовой информации в языке С++ используются символы (константы), символьные переменные и строки (строковые константы), для которых в языке С++ не введено отдельного типа в отличие от некоторых других языков программирования.

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

char список_имен_переменных;

Например:

const char c='c'; 
  //символ – занимает один байт, его значение не меняется
char a,b; 
  /*символьные переменные, занимают по одному байту, 
    значения меняются*/
const char *s="Пример строки\n"; 
  //текстовая константа

Строка – это последовательность символов, заключенная в двойные кавычки (" ").

Размещая строку в памяти, транслятор автоматически добавляет в ее конце символ '\0' (нулевой символ или нулевой байт, который является признаком конца строки). В записи строки может быть и один символ: "А" (заключен в двойные кавычки), однако, в отличие от символьной константы 'А' (используются апострофы), длина строки "А" равна 2 байтам.

В языке С++ строка – это пронумерованная последовательность символов (массив символов), она всегда имеет тип char[]. Все символы строки нумеруются, начиная с нуля. Символ конца строки также нумеруется – ему соответствует наибольший из номеров. Таким образом, строка считывается значением типа "массив символов". Количество элементов в таком массиве на 1 больше, чем изображение соответствующей строки, так как в конец строки добавлен нулевой символ '\0' ( рис. 7.1).

Представление строки и символа

Рис. 7.1. Представление строки и символа

Символьная строка в программном коде может располагаться на нескольких строках. Для переноса используется символ '\' с последующим нажатием клавиши ввод. Символ '\' игнорируется компилятором, и следующая строка считается продолжением предыдущей.

Присвоить значение строке с помощью оператора присваивания нельзя, так как для массивов не определена операция прямого присваивания. Поместить строку в символьный массив можно либо при вводе, либо с помощью инициализации:

char s1[] = "ABCDEF"; //инициализация строки
char s2[]={'A','B','C','D','E','F','\0'};//инициализация строки

Операция вычисления размера (в байтах) sizeof действует для объектов символьного типа и строк.

Пример 1.

// Определение размера строк
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[]) {
  char s1[10]="string1";
  int k=sizeof(s1);
  cout<<s1<<"\t"<<k<<"\n";
  char s2[]="string2";
  k=sizeof(s2);
  cout<<s2<<"\t"<<k<<"\n";
  char s3[]={'s','t','r','i','n','g','3','\0'};
  /*окончание строки '\0' следует соблюдать, формируя 
    в программах строки из отдельных символов*/
  k=sizeof(s3);
  cout<<s3<<"\t"<<k<<"\n";
  char *s4="string4";
  //указатель на строку, ее нельзя изменить
  k=sizeof(s4);
  cout<<s4<<"\t"<<k<<"\n";
  system("pause");
  return 0;
}

Результат выполнения программы:

string1 10 – выделено 10 байтов, в том числе под '\0'

string2 8 – выделено 8 байтов (7 + 1 байт под '\0' )

string3 8 – выделено 8 байтов (7 + 1 байт под '\0' )

Ввод-вывод символьных данных и строк

1) Ввод-вывод одиночного символа

getchar()функция (без параметров) используется для ввода одиночного символа из входного потока. Она возвращает 1 байт информации (символ) в виде значения типа int. Это сделано для распознавания ситуации, когда при чтении будет достигнут конец файла.

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

Например:

/*Программа считывает из входного потока один символ, а затем выводит его на экран*/
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[]){
  char ch;
  ch=getchar();
  putchar(ch);
  system("pause");
  return 0;
}

Пример 2. Введите предложение, в конце которого стоит точка, и подсчитайте общее количество символов, отличных от пробела (не считая точки).

#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[]){
  char z; //z - вводимый символ
  int k; //k - количество значащих символов
  printf("Напишите предложение с точкой в конце:\n");
  for (k=0; (z=getchar())!='.';)
  /*выражение z=getchar() заключено в скобки, так как 
    операция присваивания имеет более низкий ранг, 
    чем операция сравнения*/
    if (z!=' ') 
      k++;
  printf("\nКоличество символов=%d",k);
  system("pause");
  return 0;
}

Результат выполнения программы:

Напишите предложение с точкой в конце:
1 2 3 4 5 6 7 8 9 0.
Количество символов=10

2) Ввод-вывод стандартного текстового (символьного) потока

gets(s)функция, которая считывает строку s из стандартного потока до появления символа '\n', сам символ '\n' в строку не заносится.

puts(s)функция, которая записывает строку в стандартный поток, добавляя в конец строки символ '\n', в случае удачного завершения возвращает значение больше или равное 0 и отрицательное значение ( EOF = -1 ) в случае ошибки.

Например:

#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[]){
  char s[20];
  gets(s);
  puts(s);
  system("pause");
  return 0;
}

Результат выполнения программы: при вводе строки "123 456 789" чтение данных осуществляется побайтно до символа '\n', то есть в s занесется строка "123 456 789\0" (управляющая последовательность '\0' на экран не выводится, а является признаком конца строки). При выводе строки функция puts возвращает в конце строки дополнительно один символ '\n', следовательно, будет выведена строка "123 456 789\n" (управляющая последовательность '\n' на экран не выводится, а осуществляет перевод курсора на новую строку).

Пример 3. Вычислите длину введенной строки.

#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[]){
  char st[100];
  int i=0;
  puts("Введите строку:");
  gets(st);
  while(st[i++]);
  printf("Длина введенной строки = %i\n",i-1);
  system("pause");
  return 0;
}
< Лекция 7 || Лекция 8: 123 || Лекция 9 >
Денис Курбатов
Денис Курбатов
Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!