Опубликован: 02.02.2011 | Уровень: для всех | Доступ: свободно
Лекция 8:

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

< Лекция 7 || Лекция 8: 123 || Лекция 9 >

3) Стандартные потоки ввода-вывода символьных данных и строк

cin – оператор, который определяет стандартные потоки ввода данных.

cout – оператор, который определяет стандартные потоки вывода данных.

<< – операция записи данных в поток;

>> – операция чтения данных из потока.

Например:

#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[]){
  char s[20];
  cin>>s; //ввод строки из стандартного потока
  cout<<s; //вывод строки в стандартный поток
  system("pause");
  return 0;
}

Результат выполнения программы: при вводе строки "123 456 789" чтение данных осуществляется побайтно до первого пробела, то есть в s занесется только первое слово строки "123\0", следовательно, выведется: "123".

Пример 4. Введите слово и замените в нем все вхождения заглавной латинской 'A' на малую латинскую 'a'. Выведите слово после редактирования.

#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[]){
  char st[80];
  int i;
  cout << "\nВведите слово: ";
  cin >> st;
  for(i=0;st[i]!='\0';i++)
     if (st[i]=='A') st[i]='a';
  cout << "\nСлово после редактирования: "<< st;
  system("pause");
  return 0;
}

4) Форматированный ввод-вывод символьных данных и строк

printf()функция, осуществляющая форматированный вывод данных.

scanf()функция, осуществляющая форматированный ввод данных.

%cспецификатор формата ввода-вывода одиночного символа.

%sспецификатор формата ввода-вывода строки символов.

Например:

#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[]){
  char s[20];
  scanf("%s",s); 
  //для строк не используется обращение по адресу &
  printf("%s",s);
  system("pause");
  return 0;
}

Результат выполнения программы: при вводе строки "123 456 789", чтение данных осуществляется побайтно до первого пробела, то есть в строку s занесется только первое слово строки "123\0", следовательно, выведется: "123". Так как s – имя символьного массива, то есть адрес его начального элемента, операция & в функции scanf для строк не используется.

Пример 5. Записать введенную строку символов в обратном порядке.

#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[]){
  char st[80];
  char temp;
  int i,len=0;
  printf("\nВведите строку > ");
  scanf("%s",st);
  while (st[len++]); //вычисление длины строки
  len-=2;//поправка на символ конца строки и нумерацию с нуля
  for(i=0;i<len;i++,len--){
    temp=st[i]; //обмен символов
    st[i]=st[len];
    st[len]=temp;
  }
  printf("\nПолученная строка  > %s",st);
  system("pause");
  return 0;
}

Внутренние коды символов

В языке С++ принято соглашение, что везде, где синтаксис позволяет использовать целые числа, можно использовать и символы, то есть данные типа char, которые при этом представляются числовыми значениями своих внутренних кодов. Такое соглашение позволяет сравнительно просто упорядочивать символы, обращаясь с ними как с целочисленными величинами. Например, внутренние коды десятичных цифр в таблицах кодов ASCII упорядочены по числовым значениям, поэтому несложно перебрать символы десятичных цифр в нужном порядке.

//Печать десятичных цифр и их кодов
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[]){
  char z;
  for (z='0'; z<='9'; z++) {
    if (z=='0' || z=='5')
      printf ("\n");
    printf("%c - %x  ",z,z); 
  }
  system("pause");
  return 0;
}

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

Пример 6. Вывести на экран вторую часть таблицы кодировки символов (символы с кодами от 128 до 255). Таблица должна состоять из восьми колонок и шестнадцати строк.

#include "stdafx.h"
#include <iostream>
using namespace std;
#define SM 128
int _tmain(int argc, _TCHAR* argv[]){
  unsigned char ch;
  /*если ch объявить как char, то буквам русского алфавита 
    будут соответствовать отрицательные коды*/
  int i,j;
  printf("Таблица ASCII кодировки символов\n");
  for (i=0; i<16; i++) { // шестнадцать строк
    ch=i+SM;   
    for (j=1; j<=8; j++) { // восемь колонок
      printf ("%4c -%4i",ch,ch);
      ch+=16;
    }
    printf ("\n");
  }
  system("pause");
  return 0;
}

Ключевые термины

Внутренние коды символов – целые числа, однозначно соответствующие символам во внутреннем представлении.

Инициализация строкиопределение значения строки.

Размер строки – объем памяти, занимаемой строкой, выраженный в байтах.

Символ конца строки – нулевой байт, являющийся признаком конца строки символов.

Символьная константа – константа типа char.

Символьная переменнаяпеременная типа char.

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

Краткие итоги

  1. Для представления текстовой информации в С++ используются символьные данные и строки.
  2. В С++ не определен строковый тип данных, и строка представляется как массив символов.
  3. Инициализировать строку можно как массив символов.
  4. Признаком конца строки является нулевой символ.
  5. Обратиться к элементу строки можно по индексу, который соответствует порядковому номеру элемента.
  6. Нумерация элементов строки начинается с нуля. Размер строки определяется количеством входящих в нее символов.
  7. В С++ предусмотрены различные способы ввода и вывода одиночных символов и строк: с помощью стандартных функций, с помощью потокового или форматированного ввода/вывода. При считывании строки с клавиатуры признак конца строки добавляется автоматически.
  8. Каждому символу однозначно соответствует его внутренний код.
< Лекция 7 || Лекция 8: 123 || Лекция 9 >
Денис Курбатов
Денис Курбатов
Владислав Нагорный
Владислав Нагорный

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

Спасибо!