Школа создателей компьютерных игр

BannerDrive.ru
[Главная] [С чего начать?] [Дистанционное обучение] [Статьи] [Обучалки] [Книги] [Софт] [Форум] [Ссылки] [О сайте]

Строковые функции



Подпишитесь на рассылку "Создание компьютерных игр"

Рассылки Subscribe.Ru
Создание компьютерных игр

Рассылка выходит раз в месяц.


Понравился сайт? Узнайте, как помочь сайту.


Рекомендуемые книги


Андре Ламот.
Программирование трехмерных игр для Windows. Советы профессионала по трехмерной графике и растеризации


Андре Ламот.
Программирование игр для Windows. Советы профессионала


Проголосуйте за сайт в рейтинге GameTop!
(нажмите на кнопку рейтинга)

GameTop - рейтинг игровых ресурсов. Портал Rolemancer (www.rolemancer.ru)

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


Статистика посещаемости

Rambler's Top100

Динамическая память | Все обучалки раздела | Введение в консольные функции

Описание

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

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

Скачать обучалку (Visual C++ 6)

Работа программы

Исходный код

// Done by TheTutor -- 7/5/02

// Перевод © 2004 Евгений Казеко
// www.gamecoder.kazeko.com
// evgeniy@kazeko.com

/*      В языке С есть много отличных функций для работы со строками. В этой обучалке рассматриваются
      некоторые из них. В конце этого файла даны описания для всех функций, которые мы будем
      использовать. Но сперва вспомним что такое строка.

      Строка это обычный символьный массив, который заканчивается специальным символом, который
      называется "NULL terminator" (нулевой завершающий символ). Возьмем следующий код:

      char str[] = "Hi";

      Он создает строку с именем переменной "str" - если мы посмотрим на каждую ячейку этого
      массива, мы увидим следующее:

      str[0] = 'H'
      str[1] = 'i'
      str[2] = NULL

      Длина этого массива равна 3, потому что он содержит 2 буквы (Hi), и нулевой завершающий
      символ (который является эквивалентом 0)

      А теперь программа.
*/

#include <stdio.h>
#include <string.h>
#include <malloc.h>

#define STR_MAX 256 // Наибольшее число символов в нашей строке
                           
/*      Эта обучалка делает следующее:

      1) Мы запросим у пользователя ввод двух строк
      2) Мы создадим одну длинную строку из двух введенных строк и напечатаем ее на экран
      3) Мы определим, равны ли эти две строки
      4) И наконец, мы выясним, содержится ли первая строка во второй
*/


int main()
{
      // Как и все хорошие программы на С, эта начнется с нескольких переменных

      // Это два символьных буфера (строки) которые мы используем для пользовательского ввода
      
      char str1[STR_MAX] = {0};
      char str2[STR_MAX] = {0};


      char *buffy = NULL; // Это будет строка, под которую мы динамически выделим память


      int len1 = 0; // Для хранения длины str1
      int len2 = 0; // Для хранения длины str2
      
      // Сперва запросим ввод строки и прочтем то, что введено

      printf("Type in a string: ");
      scanf("%s",str1);

      rewind(stdin); // Подготовимся для еще одного ввода

      // Запросим еще одну строку

      printf("Type in another string: ");
      scanf("%s",str2);


      // Теперь у нас две строки, определим длину каждой из них
      
      // Функция strlen() делает то, что вы ожидаете - возвращает нам число символов в строке.
      // Однако важно помнить, что функция НЕ включает нулевой завершающий символ. Например, 
      // длина "Hello" равна 5.


      len1 = strlen(str1); // Определим длину str1 -- (без NULL)
      len2 = strlen(str2); // Определим длину str2 -- (без NULL)


      // Динамически выделим память под строку, размером str1 плюс str2

      buffy = (char*)malloc(sizeof(char) * (len1 + len2 + 1)); 
      
      // Обратите внимание на +1, это для символа NULL terminator


            // Проверка ошибок

            if(!buffy)
                  return 0; // Не смогли выделить память.


      /*      Настало время для работы с функциями
            Сперва объединим str1 и str2

            Мы начнем с того, что поместим str1 в buffy      */


      sprintf(buffy,"%s",str1);

      /*      Если вы знаете printf(), значит вы легко поймете sprintf(). Вместо того, чтобы печатать
            на экран, эта функция "печатает" в строковой буфер, который передается в функцию
            первым параметром (в нашем случае это buffy)

            Для лучшего понимания разобъем функцию на части:
      */
      
      /* sprintf(buffy,"%s",str1);
                         |
                         |__ Этот параметр является указателем char* на массив, который будет заполняться.
                               Представьте его как "строку для хранения", потому что там будет храниться
                               результат вызова sprintf().
                                    

         sprintf(buffy,"%s",str1);
                                   |
                                   |__ Это "форматирующий параметр", указывающий на то, как будет
                                       заполняться buffy (в нашем случае). Форматирующие параметры
                                       для данной функции точно такие же, как и для printf().
                                 


         sprintf(buffy,"%s",str1);
                                             |
                                             |__ Также, как и для printf(), это "необязательный параметр",
                                                который необходим только тогда, когда указан "форматирующий
                                                параметр". Так как наш форматирующий параметр определяет
                                                одну строку (%s = символьная строка), мы должны передать
                                                в функцию добавочный параметр (который должен быть символьной
                                                строкой), и поэтому мы передаем "str1"
                                          
      */
      
      // Итак, мы поместили str1 в buffy (что означает, что buffy теперь имеет то же значение,
      // что и str1). Теперь присоединим к buffy строку str2.

      strcat(buffy,str2); // Приписываем "str2" в конец buffy
      /*
            О функции strcat() можно думать следующим образом:

            strcat(куда, что добавить);

            К строковому буферу "куда" (в его конец), добавляется то, что содержится
            в "что добавить". Вот краткая демонстрация, показывающая, как это работает:


                  char aaa[64] = "The";
                  char bbb[64] = "Tutor";

                  strcat(aaa,bbb); // Объединяем строки

            Строка "aaa" теперь будет выглядеть вот так:

            aaa = "TheTutor"            // (строка ВКЛЮЧАЕТ в себя NULL terminator)
      */

      // Напечатаем объединенную строку на экран

      printf("%s\n",buffy);

      /*      Теперь проверим, равны ли "str1" и "str2". Под понятием "равны" мы
            подразумеваем, что каждый символ в строках абсолютно одинаков, например:
            "hello" равно "hello", но "thetutor" не равно "TheTutor"

            Функция  strcmp() работает вот так:
            
            Если "str1" меньше "str2", возвращаемое значение меньше нуля.
            Если "str1" идентична "str2", возвращаемое значение равно нулю.
            Если "str1" больше "str2", возвращаемое значение больше нуля.
      */


      if(strcmp(str1,str2) == 0)       // Если "str1" идентична "str2"
            printf("%s is equal to %s\n",str1,str2);

      else            // "str1" и "str2" различаются
            printf("%s is not equal to %s\n",str1,str2);
                                      
      /*      И наконец, определим, содержится ли строка "str1" в строке "str2".
            Например, если у нас две строки:

            char aaa[64] = "The";
            char bbb[64] = "TheTutor";

            Строка "The" содержится в строке "TheTutor"

            Рассмотрим функцию strstr()
            

            strstr(str2,str1)
                          |
                          |__ Это строка, в которой мы ищем. Мы хотим поискать в этой строке
                              строку "str1" (в нашем случае)

            strstr(str2,str1)
                                 |
                                 |__ Это наша "строка поиска" (которую мы ищем)

            Возвращаемое значение это строковой указатель, который указывает на начало
            ПЕРВОГО появления строки str1 в str2 (если оно есть), в противном случае
            возвращается NULL

      */

      if(strstr(str2,str1))            // Если "str1" содержится в "str2"
            printf("%s is contained within %s is TRUE!\n",str1,str2);

      else // "str1" не содержится в "str2"
            printf("%s is contained within %s is FALSE!\n",str1,str2);


      free(buffy);      // Освобождаем память
      return 0;            // Выход из программы
}


/*
      Как было обещано, список используемых функций:
      

      
      size_t strlen(const char*); 
      
      Функция берет char* (указатель на строку) и возвращает длину строки
      БЕЗ нулевого символа

      size_t, возвращаемый тип - это unsigned int


*************************************************************************************


      int sprintf(char *buffer, const char *format [, argument] ...);

      Функция работает также, как и printf(), за исключением того, что вместо печати
      на экран, заполняется "buffer". Примеры:

            char buff[64] = {0};
            
            sprintf(buff,"%s = %d","My age",3);
       
            После вызова функции, buff будет выглядеть вот так:
      
            buff[0] = 'M'                  buff[6] = ' '
            buff[1] = 'y'                  buff[7] = '='
            buff[2] = ' '                  buff[8] = ' '
            buff[3] = 'a'                  buff[9] = '3'
            buff[4] = 'g'                  buff[10] = NULL            // Строка будет такой:  "My age = 3"
            buff[5] = 'e'                  
      
      В этом примере мы передаем напрямую строку и число 3, но это могли бы быть и переменные.

      Функция вовращает число байтов, которое хранится в буфере, не считая нулевого символа.


**************************************************************************************


      char* strcat(char *str_dest, const char *str_source);

      Функция strcat() добавляет "str_source" в конец "str_dest"
      Это выглядит так:
            
            char aaa[64] = "The";
            char bbb[64] = "Tutor";
      
            aaa[0] = 'T'
            aaa[1] = 'h'
            aaa[2] = 'e'
            aaa[3] = NULL      --      Добавляется из bbb[0] = 'T'
            aaa[4] =  ?            --      Добавляется из bbb[1] = 'u'
            aaa[5] =  ?            --  Добавляется из bbb[2] = 't'
            aaa[6] =  ?            --  Добавляется из bbb[3] = 'o'      
            aaa[7] =  ?            --      Добавляется из bbb[4] = 'r'
            aaa[8] = NULL      --  strcat() завершает строку нулевым символом
      
            В результате получаем aaa = "TheTutor"

      Возвращаемое значение strcat() такое же, как и "str_dest"



**************************************************************************************


      int strcmp(const char *str1, const char *str2);

      Функция сравнивает "str1" и "str2". Если они равны (что значит, идентичны), 
      возвращаемое значение равно нулю. В другом случае возвращаются другие числа.



*************************************************************************************

  char* strstr(const char *searchMe, const char *str2SearchFor);

      Функция ищет строку "str2SearchFor" в "searchMe". Если строка будет найдена,
      функция возвращает указатель на первую букву найденной строки. В другом
      случае возвращается NULL


*************************************************************************************


/*
|  TheTutor                    
|  thetutor@gametutorials.com  
|  © 2001-2002 GameTutorials   
*/

// Перевод © 2004 Евгений Казеко
// www.gamecoder.kazeko.com
// evgeniy@kazeko.com 

Скачать обучалку (Visual C++ 6)

Динамическая память | Все обучалки раздела | Введение в консольные функции

[Главная] [С чего начать?] [Дистанционное обучение] [Статьи] [Обучалки] [Книги] [Софт] [Форум] [Ссылки] [О сайте]

Copyright © 2003-2005 Евгений Казеко. Все права защищены. E-mail: evgeniy@kazeko.com

входные двери от производителя Форпост , Ассортимент профлиста. Для забора профлист Металлпрофиль. , Отправить смс с картинками на номер билайн. Бесплатно отправить смс билайн.