Структуры и алгоритмы компьютерной обработки данных

Функции для работы со строками

Разбить на страницы
Показывать лекцию целиком

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

Для работы со строками используются библиотечные функции, прототипы которых находятся в заголовочных файлах stdlib.h и string.h.

В программах, в зависимости от типа, вызовы функций для работы со строками задаются в виде:

ИмяФ(СписокАргументов);

или

ИмяПерем=ИмяФ(СписокАргументов);

где ИмяФимя функции; СписокАргументовсписок аргументов, передаваемых в тело функции; ИмяПерем – идентификатор соответствующего типа.

Например:

y=strlen(st); 
  /*переменной y присвоить значение длины строки st*/

При использовании библиотечных функций следует учитывать некоторые особенности их выполнения и представления символьных данных в памяти.

  • Функции, работающие с регистрами, распространяются только на латиницу.
  • В С++ некоторые параметры функций обработки символов принадлежат типу int (unsigned), поэтому, если число станет больше 128 (255), функция будет работать некорректно.
  • Перед первым обращением к строке она должна быть объявлена и проинициализирована. Во многих случаях в качестве начального значения строки необходимо бывает задать пустую строку. Такую инициализацию можно выполнить с помощью вызова функции strcpy(s, "");, но более эффективным будет присваивание *s=0;. Кроме того пустую строку можно инициализировать char s[10]=""; или char s[10]="\0";, но при этом размер строки должен быть задан.
  • Функции копирования (кроме strncpy ) не проверяют длину строки. Размер строки-приемника должен быть больше, чем размер источника на 1 символ (для символа '\0' ).
  • При вызове функции strncpy следует помнить, что, если длина копируемой строки превосходит параметр kol, то строка-получатель не будет завершена символом '\0'. В этом случае такой символ надо дописывать в конец строки вручную.

    Функции для работы со строками – файл stdlib.h
    Функция Прототип Краткое описание действий
    atof double atof (const char *str); преобразует строку str в вещественное число типа double
    atoi int atoi (const char *str); преобразует строку str в целое число типа int
    atol long atol (const char *str); преобразует строку str в целое число типа long
    itoa char *itoa (int v, char *str, int baz); преобразует целое v в строку str. При изображении числа используется основание baz (2<=baz<=36). Для отрицательного числа и baz =10 первый символ "минус" (–).
    ltoa char *ltoa (long v, char *str, int baz); преобразует длинное целое v в строку str. При изображении числа используется основание baz (2<=baz<=36).
    ultoa char *ultoa (unsigned long v, char *str, int baz); преобразует беззнаковое длинное целое v в строку str
    Функции для работы со строками – файл string.h
    Функция Прототип Краткое описание действий
    strcat char *strcat (char *sp, const char *si); приписывает строку si к строке sp (конкатенация строк)
    strchr char *strchr (const char *str, int c); ищет в строке str первое вхождение символа с
    strcmp int strcmp (const char *str1, const char *str2); сравнивает строки str1 и str2. Результат отрицателен, если str1<str2 ; равен нулю, если str1==str2, и положителен, если str1>str2 (сравнение беззнаковое)
    strcpy char *strcpy (char *sp, const char *si); копирует байты строки si в строку sp
    strcspn int strcspn (const char *str1, const char *str2); определяет длину первого сегмента строки str1, содержащего символы, не входящие во множество символов строки str2
    strdup char *strdup (const char *str); выделяет память и переносит в нее копию строки str
    strlen unsigned strlen (const char *str); вычисляет длину строки str
    strlwr char *strlwr (char *str); преобразует буквы верхнего регистра в строке в соответствующие буквы нижнего регистра
    strncat char *strncat (char *sp, const char *si, int kol); приписывает kol символов строки si к строке sp (конкатенация)
    strncmp int strncmp (const char *str1, const char *str2, int kol); сравнивает части строк str1 и str2, причем рассматриваются первые kol символов. Результат отрицателен, если str1<str2 ; равен нулю, если str1==str2, и положителен, если str1>str2
    strncpy char *strncpy (char *sp, const char *si, int kol); копирует kol символов строки si в строку sp ("хвост" отбрасывается или дополняется пробелами)
    strnicmp int strnicmp (char *str1, const char *str2, int kol); сравнивает не более kol символов строки str1 и строки str2, не делая различия регистров (см. функцию strncmp )
    strnset char *strnset (char *str, int c, int kol); заменяет первые kol символов строки str символом c
    strpbrk char *strpbrk (const char *str1, const char *str2); ищет в строке str1 первое появление любого из множества символов, входящих в строку str2
    strrchr char *strrchr (const char *str, int c); ищет в строке str последнее вхождение символа с
    strset char *strset (char *str, int c); заполняет строку str заданным символом c
    strspn int strspn (const char *str1, const char *str2); определяет длину первого сегмента строки str1, содержащего только символы, из множества символов строки str2
    strstr char *strstr (const char *str1, const char *str2); ищет в строке str1 подстроку str2. Возвращает указатель на тот элемент в строке str1, с которого начинается подстрока str2
    strtod double strtod (const char *str, char **endptr); преобразует символьную константу str в число двойной точности. Если endptr не равен NULL, то *endptr возвращается как указатель на символ, при достижении которого прекращено чтение строки str
    strtok char *strtok (char *str1, const char *str2); ищет в строке str1 лексемы, выделенные символами из второй строки
    strtol long strtol (const char *str, char **endptr, int baz); преобразует символьную константу str к значению "длинное число" с основанием baz (2<=baz<=36). Если endptr не равен NULL, то *endptr возвращается как указатель на символ, при достижении которого прекращено чтение строки str
    strupr char *strupr (char *str); преобразует буквы нижнего регистра в строке str в буквы верхнего регистра

    Сравнение строк с помощью функции strcmp осуществляется побайтово в лексикографическом порядке, то есть в порядке следования соответствующих байтов строк в таблице кодировки. Именно поэтому значения элементов в строках зависят от регистра.

    При использовании библиотечных функций следует иметь в виду, что указатель на строку и имя массива символов указывают на адрес размещения строки в памяти. Это означает, что изменения значений элементов строки сохраняются после завершения работы функции. Чтобы не допустить изменений в строке используется указатель на константу, который не позволит модифицировать данные, хранящиеся по адресуемой области памяти.

    Пример 1.

    //Программа демонстрирует работу функций из файла stdlib.h 
    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    int _tmain(int argc, _TCHAR* argv[]){
      char sv[]="23.547",
           si[]="1234",
           sl[]="-112424",
           st1[15],st2[25],st3[15];
      double v;
      int i;   
      long l,t=457821;
          
      v=atof(sv); 
      printf("Преобразование строки в вещественное число = %f\n",v);
      i=atoi(si); 
      printf("Преобразование строки в целое число = %d\n",i);
      l=atol(sl); 
      printf("Преобразование строки в длинное целое число = %ld\n",l);
      printf("Преобразование длинного целого числа в строку = %s\n",
             ultoa(t,st1,10));
      printf("Преобразование длинного целого числа в строку = %s\n",
             ultoa(t,st2,2));
      printf("Преобразование длинного целого числа в строку = %s\n",
              ultoa(t,st3,16));
      system("pause");
      return 0;
    }

    Пример 2.

    //Программа демонстрирует работу функций из файла string.h 
    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    int _tmain(int argc, _TCHAR* argv[]){
      char st[50],sp[100],str[]="", 
           si[]="qwerty",
           sl[]="qwerty",
           sw[]="qwertyu";
      int len=0, sravn1, sravn2, sravn3, kol=5;    
      printf("Введите строку: ");
      gets(st);
      len=strlen(st); printf("Длина строки = %d\n",len);
      printf("Конкатенация строк: %s\n",strcat(st,"12cdb")); 
      sravn1=strcmp(si,sl);
      printf("Сравнение строк: %s==%s результат %d\n", 
              si,sl,sravn1);
      sravn2=strcmp(si,sw);
      printf("Сравнение строк: %s<%s результат %d\n", 
              si,sw,sravn2);
      sravn3=strcmp(sw,si);
      printf("Сравнение строк: %s>%s результат %d\n", 
              sw,si,sravn3);
      printf("Копирование байтов: %s\n",strcpy(sp,st));
      printf("Преобразование букв нижнего регистра в верхний: %s\n", 
    strupr(st));
      printf("Преобразование букв верхнего регистра в нижний: %s\n", 
             strlwr(st));
      printf("Копирование %d символов в другую строку: %s\n",  
              kol,strncpy(str,st,kol)); 
      printf("Поиск в строке первого появления символа из другой строки:  
             %s\n",strpbrk(st,si));
      printf("Поиск в строке последнее вхождение заданного 
              символа: %s\n",strrchr(st,'t')); 
      system("pause");
      return 0;
    }

    Пример 3.

    //Поиск множества неповторяющихся символов строки
    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    int _tmain(int argc, _TCHAR* argv[]){
      char st[80];
      int i,j,flag,len;
      printf("Введите строку: ");
      gets(st);
      len=strlen(st); //длина строки
      printf("Неповторяющиеся символы строки образуют множество: ");
      for (i=0;i<len;i++){
        flag=0; //флаг проверки на совпадение
        for (j=0;j<i;j++) //сравнение символа с предыдущими
          if (st[i]==st[j]) flag=1;
        if (flag==0)printf("%c",st[i]);
      }
      system("pause");
      return 0;
    }

    Пример 4.

    /*Удаление лишних левых и внутренних пробелов в строке при выводе*/
    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    int _tmain(int argc, _TCHAR* argv[]){
      char st[80];
      int i=0,len;
      printf("Введите строку: ");
      gets(st);
      len=strlen(st);//длина строки 
      printf("Преобразованная строка: ");
      //Удалены лишние пробелы слева 
      while (st[i++]==' '); 
      //Удалены лишние пробелы внутри строки  
      for (--i;i<len;i++)
        if ((st[i]!=' ')||(st[i+1]!=' ')) 
          printf("%c",st[i]); //если рядом два пробела
      system("pause");
      return 0;
    }

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

    Конкатенация строк – это результат последовательного соединения строк.

    Лексикографический порядок – правило сравнения символов, основанное на величине кода внутреннего представления каждого символа.

    Пустая строка – это строка единичной длины, содержащая только символ конца строки.

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

    Стандартные функции по работе со строками – это функции обработки строк, прототипы которых входят в стандартные библиотеки С++.

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

  • Для работы со строками в языке С++ предусмотрены стандартные функции, прототипы которых включены в стандартные библиотеки stdlib.h и string.h.
  • При обращении к функциям для работы со строками следует учитывать, что изменение значений элементов строк сохраняются после завершения работы функции.
  • Перед использованием строки в программном коде ее необходимо проинициализировать. Неинициализированные строки могут привести к некорректной работе программы.
  • В некоторых стандартных функциях по работе со строками следует проводить контроль длин параметров.
  • Результат работы некоторых функций требует принудительного добавления к строке символа конца строки.
  • Значения элементов строк зависят от регистра.
  • Изменение регистра символов кириллицы в программе может выполняться некорректно.
  • Лабораторная работа 8. Функции для работы со строками

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

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

    Теоретические сведения.

    Ознакомьтесь с материалом лекции 8.

    Задания к лабораторной работе.

    Выполните приведенные ниже задания.

  • Дана строка, в которой слова разделены одним пробелом. Замените первые буквы всех слов на заглавные (если слово начинается с заглавной буквы, оставьте без изменения).
  • Дана строка, в которой слова разделены одним пробелом. Подсчитайте, сколько букв 'w' встречается в каждом слове.
  • Дана строка, в которой слова разделены одним пробелом. Подсчитайте, сколько в каждом слове букв, совпадающих с его первой буквой.
  • Дана строка. Преобразуйте ее так, чтобы сначала следовали цифровые символы, а затем все остальные. Порядок следования символов между собой не изменять.
  • Указания к выполнению работы.

    Каждое задание необходимо решить в соответствии с изученными методами обработки строковых и символьных данных, используя библиотечные функции обработки строковых данных в языке С++.

    Следует реализовать каждое задание в соответствии с приведенными этапами:

  • изучить словесную постановку задачи, выделив при этом все виды данных;
  • сформулировать математическую постановку задачи;
  • выбрать метод решения задачи, если это необходимо;
  • разработать графическую схему алгоритма;
  • записать разработанный алгоритм на языке С++;
  • разработать контрольный тест к программе;
  • отладить программу;
  • представить отчет по работе.
  • Требования к отчету.

    Отчет по лабораторной работе должен соответствовать следующей структуре.

  • Титульный лист.
  • Словесная постановка задачи. В этом подразделе проводится полное описание задачи. Описывается суть задачи, анализ входящих в нее физических величин, область их допустимых значений, единицы их измерения, возможные ограничения, анализ условий при которых задача имеет решение (не имеет решения), анализ ожидаемых результатов.
  • Математическая модель. В этом подразделе вводятся математические описания физических величин и математическое описание их взаимодействий. Цель подраздела – представить решаемую задачу в математической формулировке.
  • Алгоритм решения задачи. В подразделе описывается разработка структуры алгоритма, обосновывается абстракция данных, задача разбивается на подзадачи. Схема алгоритма выполняется по ЕСПД (ГОСТ 19.003-80 и ГОСТ 19.002-80).
  • Листинг программы. Подраздел должен содержать текст программы на языке программирования С++, реализованный в среде MS Visual Studio 2010.
  • Контрольный тест. Подраздел содержит наборы исходных данных и полученные в ходе выполнения программы результаты.
  • Выводы по лабораторной работе.
  • Ответы на контрольные вопросы.
  • Контрольные вопросы

  • Что будет являться результатом работы функции побайтового копирования строк, если длина строки-источника превосходит допустимый размер строки-приемника?
  • Что будет являться результатом работы функции побайтового копирования строк, если длина строки-источника меньше размера строки-приемника?
  • Почему при сравнении строк важен регистр символов?
  • Как сравниваются строки разной длины?
  • Какие возможны последствия при обращении к неинициализированной строке?
  • Почему функция изменения регистра символов строки может некорректно работать с кириллицей?
  • Страницы:

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

    Для работы со строками используются библиотечные функции, прототипы которых находятся в заголовочных файлах stdlib.h и string.h.

    В программах, в зависимости от типа, вызовы функций для работы со строками задаются в виде:

    ИмяФ(СписокАргументов);

    или

    ИмяПерем=ИмяФ(СписокАргументов);

    где ИмяФимя функции; СписокАргументовсписок аргументов, передаваемых в тело функции; ИмяПерем – идентификатор соответствующего типа.

    Например:

    y=strlen(st); 
      /*переменной y присвоить значение длины строки st*/

    При использовании библиотечных функций следует учитывать некоторые особенности их выполнения и представления символьных данных в памяти.

  • Функции, работающие с регистрами, распространяются только на латиницу.
  • В С++ некоторые параметры функций обработки символов принадлежат типу int (unsigned), поэтому, если число станет больше 128 (255), функция будет работать некорректно.
  • Перед первым обращением к строке она должна быть объявлена и проинициализирована. Во многих случаях в качестве начального значения строки необходимо бывает задать пустую строку. Такую инициализацию можно выполнить с помощью вызова функции strcpy(s, "");, но более эффективным будет присваивание *s=0;. Кроме того пустую строку можно инициализировать char s[10]=""; или char s[10]="\0";, но при этом размер строки должен быть задан.
  • Функции копирования (кроме strncpy ) не проверяют длину строки. Размер строки-приемника должен быть больше, чем размер источника на 1 символ (для символа '\0' ).
  • При вызове функции strncpy следует помнить, что, если длина копируемой строки превосходит параметр kol, то строка-получатель не будет завершена символом '\0'. В этом случае такой символ надо дописывать в конец строки вручную.

    Функции для работы со строками – файл stdlib.h
    Функция Прототип Краткое описание действий
    atof double atof (const char *str); преобразует строку str в вещественное число типа double
    atoi int atoi (const char *str); преобразует строку str в целое число типа int
    atol long atol (const char *str); преобразует строку str в целое число типа long
    itoa char *itoa (int v, char *str, int baz); преобразует целое v в строку str. При изображении числа используется основание baz (2<=baz<=36). Для отрицательного числа и baz =10 первый символ "минус" (–).
    ltoa char *ltoa (long v, char *str, int baz); преобразует длинное целое v в строку str. При изображении числа используется основание baz (2<=baz<=36).
    ultoa char *ultoa (unsigned long v, char *str, int baz); преобразует беззнаковое длинное целое v в строку str
    Функции для работы со строками – файл string.h
    Функция Прототип Краткое описание действий
    strcat char *strcat (char *sp, const char *si); приписывает строку si к строке sp (конкатенация строк)
    strchr char *strchr (const char *str, int c); ищет в строке str первое вхождение символа с
    strcmp int strcmp (const char *str1, const char *str2); сравнивает строки str1 и str2. Результат отрицателен, если str1<str2 ; равен нулю, если str1==str2, и положителен, если str1>str2 (сравнение беззнаковое)
    strcpy char *strcpy (char *sp, const char *si); копирует байты строки si в строку sp
    strcspn int strcspn (const char *str1, const char *str2); определяет длину первого сегмента строки str1, содержащего символы, не входящие во множество символов строки str2
    strdup char *strdup (const char *str); выделяет память и переносит в нее копию строки str
    strlen unsigned strlen (const char *str); вычисляет длину строки str
    strlwr char *strlwr (char *str); преобразует буквы верхнего регистра в строке в соответствующие буквы нижнего регистра
    strncat char *strncat (char *sp, const char *si, int kol); приписывает kol символов строки si к строке sp (конкатенация)
    strncmp int strncmp (const char *str1, const char *str2, int kol); сравнивает части строк str1 и str2, причем рассматриваются первые kol символов. Результат отрицателен, если str1<str2 ; равен нулю, если str1==str2, и положителен, если str1>str2
    strncpy char *strncpy (char *sp, const char *si, int kol); копирует kol символов строки si в строку sp ("хвост" отбрасывается или дополняется пробелами)
    strnicmp int strnicmp (char *str1, const char *str2, int kol); сравнивает не более kol символов строки str1 и строки str2, не делая различия регистров (см. функцию strncmp )
    strnset char *strnset (char *str, int c, int kol); заменяет первые kol символов строки str символом c
    strpbrk char *strpbrk (const char *str1, const char *str2); ищет в строке str1 первое появление любого из множества символов, входящих в строку str2
    strrchr char *strrchr (const char *str, int c); ищет в строке str последнее вхождение символа с
    strset char *strset (char *str, int c); заполняет строку str заданным символом c
    strspn int strspn (const char *str1, const char *str2); определяет длину первого сегмента строки str1, содержащего только символы, из множества символов строки str2
    strstr char *strstr (const char *str1, const char *str2); ищет в строке str1 подстроку str2. Возвращает указатель на тот элемент в строке str1, с которого начинается подстрока str2
    strtod double strtod (const char *str, char **endptr); преобразует символьную константу str в число двойной точности. Если endptr не равен NULL, то *endptr возвращается как указатель на символ, при достижении которого прекращено чтение строки str
    strtok char *strtok (char *str1, const char *str2); ищет в строке str1 лексемы, выделенные символами из второй строки
    strtol long strtol (const char *str, char **endptr, int baz); преобразует символьную константу str к значению "длинное число" с основанием baz (2<=baz<=36). Если endptr не равен NULL, то *endptr возвращается как указатель на символ, при достижении которого прекращено чтение строки str
    strupr char *strupr (char *str); преобразует буквы нижнего регистра в строке str в буквы верхнего регистра

    Сравнение строк с помощью функции strcmp осуществляется побайтово в лексикографическом порядке, то есть в порядке следования соответствующих байтов строк в таблице кодировки. Именно поэтому значения элементов в строках зависят от регистра.

    При использовании библиотечных функций следует иметь в виду, что указатель на строку и имя массива символов указывают на адрес размещения строки в памяти. Это означает, что изменения значений элементов строки сохраняются после завершения работы функции. Чтобы не допустить изменений в строке используется указатель на константу, который не позволит модифицировать данные, хранящиеся по адресуемой области памяти.

    Пример 1.

    //Программа демонстрирует работу функций из файла stdlib.h 
    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    int _tmain(int argc, _TCHAR* argv[]){
      char sv[]="23.547",
           si[]="1234",
           sl[]="-112424",
           st1[15],st2[25],st3[15];
      double v;
      int i;   
      long l,t=457821;
          
      v=atof(sv); 
      printf("Преобразование строки в вещественное число = %f\n",v);
      i=atoi(si); 
      printf("Преобразование строки в целое число = %d\n",i);
      l=atol(sl); 
      printf("Преобразование строки в длинное целое число = %ld\n",l);
      printf("Преобразование длинного целого числа в строку = %s\n",
             ultoa(t,st1,10));
      printf("Преобразование длинного целого числа в строку = %s\n",
             ultoa(t,st2,2));
      printf("Преобразование длинного целого числа в строку = %s\n",
              ultoa(t,st3,16));
      system("pause");
      return 0;
    }

    Пример 2.

    //Программа демонстрирует работу функций из файла string.h 
    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    int _tmain(int argc, _TCHAR* argv[]){
      char st[50],sp[100],str[]="", 
           si[]="qwerty",
           sl[]="qwerty",
           sw[]="qwertyu";
      int len=0, sravn1, sravn2, sravn3, kol=5;    
      printf("Введите строку: ");
      gets(st);
      len=strlen(st); printf("Длина строки = %d\n",len);
      printf("Конкатенация строк: %s\n",strcat(st,"12cdb")); 
      sravn1=strcmp(si,sl);
      printf("Сравнение строк: %s==%s результат %d\n", 
              si,sl,sravn1);
      sravn2=strcmp(si,sw);
      printf("Сравнение строк: %s<%s результат %d\n", 
              si,sw,sravn2);
      sravn3=strcmp(sw,si);
      printf("Сравнение строк: %s>%s результат %d\n", 
              sw,si,sravn3);
      printf("Копирование байтов: %s\n",strcpy(sp,st));
      printf("Преобразование букв нижнего регистра в верхний: %s\n", 
    strupr(st));
      printf("Преобразование букв верхнего регистра в нижний: %s\n", 
             strlwr(st));
      printf("Копирование %d символов в другую строку: %s\n",  
              kol,strncpy(str,st,kol)); 
      printf("Поиск в строке первого появления символа из другой строки:  
             %s\n",strpbrk(st,si));
      printf("Поиск в строке последнее вхождение заданного 
              символа: %s\n",strrchr(st,'t')); 
      system("pause");
      return 0;
    }

    Пример 3.

    //Поиск множества неповторяющихся символов строки
    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    int _tmain(int argc, _TCHAR* argv[]){
      char st[80];
      int i,j,flag,len;
      printf("Введите строку: ");
      gets(st);
      len=strlen(st); //длина строки
      printf("Неповторяющиеся символы строки образуют множество: ");
      for (i=0;i<len;i++){
        flag=0; //флаг проверки на совпадение
        for (j=0;j<i;j++) //сравнение символа с предыдущими
          if (st[i]==st[j]) flag=1;
        if (flag==0)printf("%c",st[i]);
      }
      system("pause");
      return 0;
    }

    Пример 4.

    /*Удаление лишних левых и внутренних пробелов в строке при выводе*/
    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    int _tmain(int argc, _TCHAR* argv[]){
      char st[80];
      int i=0,len;
      printf("Введите строку: ");
      gets(st);
      len=strlen(st);//длина строки 
      printf("Преобразованная строка: ");
      //Удалены лишние пробелы слева 
      while (st[i++]==' '); 
      //Удалены лишние пробелы внутри строки  
      for (--i;i<len;i++)
        if ((st[i]!=' ')||(st[i+1]!=' ')) 
          printf("%c",st[i]); //если рядом два пробела
      system("pause");
      return 0;
    }

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

    Конкатенация строк – это результат последовательного соединения строк.

    Лексикографический порядок – правило сравнения символов, основанное на величине кода внутреннего представления каждого символа.

    Пустая строка – это строка единичной длины, содержащая только символ конца строки.

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

    Стандартные функции по работе со строками – это функции обработки строк, прототипы которых входят в стандартные библиотеки С++.

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

  • Для работы со строками в языке С++ предусмотрены стандартные функции, прототипы которых включены в стандартные библиотеки stdlib.h и string.h.
  • При обращении к функциям для работы со строками следует учитывать, что изменение значений элементов строк сохраняются после завершения работы функции.
  • Перед использованием строки в программном коде ее необходимо проинициализировать. Неинициализированные строки могут привести к некорректной работе программы.
  • В некоторых стандартных функциях по работе со строками следует проводить контроль длин параметров.
  • Результат работы некоторых функций требует принудительного добавления к строке символа конца строки.
  • Значения элементов строк зависят от регистра.
  • Изменение регистра символов кириллицы в программе может выполняться некорректно.
  • Лабораторная работа 8. Функции для работы со строками

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

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

    Теоретические сведения.

    Ознакомьтесь с материалом лекции 8.

    Задания к лабораторной работе.

    Выполните приведенные ниже задания.

  • Дана строка, в которой слова разделены одним пробелом. Замените первые буквы всех слов на заглавные (если слово начинается с заглавной буквы, оставьте без изменения).
  • Дана строка, в которой слова разделены одним пробелом. Подсчитайте, сколько букв 'w' встречается в каждом слове.
  • Дана строка, в которой слова разделены одним пробелом. Подсчитайте, сколько в каждом слове букв, совпадающих с его первой буквой.
  • Дана строка. Преобразуйте ее так, чтобы сначала следовали цифровые символы, а затем все остальные. Порядок следования символов между собой не изменять.
  • Указания к выполнению работы.

    Каждое задание необходимо решить в соответствии с изученными методами обработки строковых и символьных данных, используя библиотечные функции обработки строковых данных в языке С++.

    Следует реализовать каждое задание в соответствии с приведенными этапами:

  • изучить словесную постановку задачи, выделив при этом все виды данных;
  • сформулировать математическую постановку задачи;
  • выбрать метод решения задачи, если это необходимо;
  • разработать графическую схему алгоритма;
  • записать разработанный алгоритм на языке С++;
  • разработать контрольный тест к программе;
  • отладить программу;
  • представить отчет по работе.
  • Требования к отчету.

    Отчет по лабораторной работе должен соответствовать следующей структуре.

  • Титульный лист.
  • Словесная постановка задачи. В этом подразделе проводится полное описание задачи. Описывается суть задачи, анализ входящих в нее физических величин, область их допустимых значений, единицы их измерения, возможные ограничения, анализ условий при которых задача имеет решение (не имеет решения), анализ ожидаемых результатов.
  • Математическая модель. В этом подразделе вводятся математические описания физических величин и математическое описание их взаимодействий. Цель подраздела – представить решаемую задачу в математической формулировке.
  • Алгоритм решения задачи. В подразделе описывается разработка структуры алгоритма, обосновывается абстракция данных, задача разбивается на подзадачи. Схема алгоритма выполняется по ЕСПД (ГОСТ 19.003-80 и ГОСТ 19.002-80).
  • Листинг программы. Подраздел должен содержать текст программы на языке программирования С++, реализованный в среде MS Visual Studio 2010.
  • Контрольный тест. Подраздел содержит наборы исходных данных и полученные в ходе выполнения программы результаты.
  • Выводы по лабораторной работе.
  • Ответы на контрольные вопросы.
  • Контрольные вопросы

  • Что будет являться результатом работы функции побайтового копирования строк, если длина строки-источника превосходит допустимый размер строки-приемника?
  • Что будет являться результатом работы функции побайтового копирования строк, если длина строки-источника меньше размера строки-приемника?
  • Почему при сравнении строк важен регистр символов?
  • Как сравниваются строки разной длины?
  • Какие возможны последствия при обращении к неинициализированной строке?
  • Почему функция изменения регистра символов строки может некорректно работать с кириллицей?
  • Вернуться к учебному плану