Си-строки

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

Что такое строки?

Отметим, что наряду со строками в стиле С, которые, по сути, являются простыми массивами, есть также строковые литералы, такие как этот "literal". В действительности, что строки, что литералы — это просто наборы символов, расположенных рядом в памяти компьютера. Но между массивами и литералами все таки есть разница, литералы нельзя изменять и строки — можно.

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

Из всего выше сказанного вы должны были понять, что строки — это массивы символов, а строковые литералы — слова, окруженные двойными кавычками. Вот еще один пример литерала:

"Это статическая строка"

Вы еще не забыли про специфику строк, которая упоминалась немного выше? Так вот, Си-строки всегда должны завершаться нулевым символом, буквально — '\0'. Поэтому, чтобы объявить строку, состоящую из 49 букв, необходимо зарезервировать дополнительную ячейку под нулевой символ:

char myString[50];

Как видно из примера, длинна массива — 50 символов, 49 из которых займет строка и один, последний займет нулевой символ. Важно помнить, что в конце си-строк всегда должен быть нуль-символ, точно так же как и в конце каждого предложения есть точка. Хотя нуль символ не отображается при выводе строки, он все-равно занимает место в памяти. Поэтому, технически, в массиве из пятидесяти элементов вы смогли бы сохранить только 49 букв, потому что, последний символ нужен для завершения строки. Кроме того, указатели также могут быть использованы в качестве строки. Если вы читали статью про выделение памяти в Си, вы можете сделать нечто подобное:

char *myString; // указатель типа char
myString = malloc( sizeof(*myString) * 64 ); // выделение памяти

В этом примере мы выделили 64 ячейки в памяти для массива myString. Для высвобождения памяти воспользуйтесь функцией free().

free( myString );

Использование строк

Строки полезно использовать тогда, когда вам необходимо выполнять различные операции с текстовой информацией. Например, если вы хотите, чтобы пользователь вводил имя в программу, вы должны использовать строку. Использование функции scanf() для ввода строки — работает, но это может привести к переполнению буфера. Ведь входная строка может оказаться больше, чем размер строки-буфера. Есть несколько способов для решения этой проблемы, но самый простой способ — это использовать fgets() функцию, которая объявлена в заголовочном файле <stdio.h>.

Когда fgets() считывает входные данные от пользователя, она будет читать все символы, кроме последнего. После этого в конец считанной строки, fgets() поместит нулевой терминатор. Функция fgets() будет cчитывать символы до тех пор, пока пользователь не нажмет Enter. Давайте посмотрим пример использования fgets():

#include <stdio.h>

int main()
{
    char myString[100]; // длинная строка

    printf( "Введите длинную строку: " );

    fgets( myString, 100, stdin ); // считываем из потока ввода строку

    printf( "Вы ввели следующую строку: %s", myString );

    getchar();
}

Первым параметром для fgets() является строка, второй параметр — размер строки и третий параметр — это указатель на входной поток данных.

Результат работы программы:

CppStudio.com
Введите длинную строку: Судьба оставляет свой отпечаток
Вы ввели следующую строку: Судьба оставляет свой отпечаток

Для закрытия данного окна нажмите <ВВОД>...

Как видите, из вывода программы, во входную строку попал символ новой строки — '\n'. Так случилось из-за того, что fgets() считала в строку myString нажатие кнопки Enter и завершила работу. Это означает, что вам может понадобиться вручную удалить символ новой строки. Один из способов сделать это, посимвольный перебор. Давайте доработаем программу и удалим символ новой строки:

#include <stdio.h>

int main()
{
    char myString[100]; // длинная строка

    printf( "Введите длинную строку: " );

    fgets( myString, 100, stdin ); // читываем из потока ввода строку

    int i;
    for ( i = 0; i < 100; i++ )
    {
        if ( myString[i] == '\n' )
        {
            myString[i] = '\0';
            break;
        }
    }

    printf( "Вы ввели следующую строку: %s", myString );

    getchar();
}

Обратите внимание, что если входная строка содержит меньше 100 символов, то в строку попадет и символ новой строки. Поэтому мы можем удалить этот символ, используя простой перебор. В программу мы добавили цикл, в котором перебираем символы  строки, строки 12-19. И когда нам встречается символ новой строки, мы его заменяем нулевым символом, строка 16. Результат работы программы:

CppStudio.com
Введите длинную строку: Судьба оставляет свой отпечаток
Вы ввели следующую строку: Судьба оставляет свой отпечаток
Для закрытия данного окна нажмите <ВВОД>...

На этом пока все. В следующей статье я расскажу вам о специальных функциях для работы со строками.

P.S.: Все мы любим смотреть разные видео-записи, но иногда бывает так, что не всегда получается воспроизвести некоторые форматы видео-файлов. Так вот, решить эту проблему можно с помощью программы — xilisoft converter ultimate. Вы без труда сможете быстро переконвертировать видео из одного формата в другой. Кроме того, эта программа умеет конвертировать еще и аудио-файлы, и анимированные изображения.

Практика

К сожалению, для данной темы пока нет подходящих задач. Если у вас есть таковые на примете, отправте их по адресу: admin@cppstudio.com. Мы их опубликуем!

Автор: Marienko L.
Дата: 13.02.2014
Поделиться:

Комментарии

  1. npavelFax

    Заработок в интернете официальная работа.

  2. Boris Evgraf

    статья похожа на машинный перевод

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.