Хелпикс

Главная

Контакты

Случайная статья





Ввод/вывод строк.



Ввод/вывод строк.

Ранее мы подробно останавливались на функциях ввода/вывода информации (scanf(), printf(), getchar(), putchar()). Они могут быть с успехом использованы для организации ввода/вывода символьных строк. Кроме этих функций, в С(С++) имеется еще пара функций (gets(), puts()), предназначенных для ввода/вывода символьных строк. Функция gets читает все символы до тех пор, пока во входном потоке не встретится символ '\n' ('\13') - нажатие клавиши Enter, после этого символ '\n' заменяется на ноль-символ ('\0') и функция gets передает введенную строку символов вызывающей функции. Ниже рассмотрен пример с несколькими вариантами использования функции gets():

#include <stdio.h>

void main() // функция определения длины строки

{ char s[5];

char *st;

              // вариант 1 ввода строки s

gets(s);     // ввод строки s

st=s;         // st указывает на строку s

printf("\n s=%s *st=%s",s,st);

              // вариант 2 ввода строки s

st=gets(s); // ввод строки s и указателя st на нее одновременно

printf("\n s=%s *st=%s",s,st);

}

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

st=(сhar *)malloc(sizeof(char)*5);    либо   st=(сhar *)malloc(5);

При этом указатель st уже будет указывать на зарезервированные 5 байт памяти, отведенные под строку.

Кроме того, функция gets() включает разряд проверки ошибки. То есть если произошла ошибка ввода или gets() встретила символ EOF, она возвращает нулевой адрес (NULL). Это упрощает контроль на EOF:

char s[10];

while(gets(s)!=NULL);

по сравнению с тем, как это выполняется при использовании функции getchar():

char s;

while((s=getchar())!=EOF);

При работе с функцией gets() необходимо помнить, что она не выполняет контроль на переполнение символьной строки, в некоторых случаях это может иметь неприятные последствия (порча памяти). Наряду с этим рекомендуется перед использованием функции gets, выполнить очистку буфера клавиатуры:

fflush(stdin);

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

     Инициализацию строки можно выполнить и с помощью функции scanf используя указатель:

     char *st ;

st=(сhar *) malloc(10);

     scanf("%s",st);

ввод символьной строки завершается при встрече либо символа ' ',либо символа '\n'.

Функция puts() предназначена для вывода символьной строки. В качестве единственного аргумента является указатель на выводимую строку:

char st[5];

. . .    ( тело функции )

puts(st);

Для правильной работы программы следует соблюдать следующие требования:

· Для переноса содержимого строки с одного места памяти в другое, необходимо предварительно выделить новое место в памяти, затем неиспользуемый участок памяти требуется освободить.

· Копирование строк с использованием не проинициализированного указателя – является грубой ошибкой программирования.

· При работе со строками, требуется обращать внимание на предупреждение типа " Подозрительное преобразование указателя " ( Suspicious pointer conversion ) или "Использование указателя до инициализации"(Possible use of...before deffinition).

· При выделении места для строки-назначения следует предусмотреть место для признака конца строки ( ‘\0’ ).

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

 



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.