Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Как вводить строки или выводить их на экран?






Выводиться строка может или уже известной вам функцией printf() со спецификатором ввода " %s ", либо специальной функцией int puts (char *string), которая выводит строку string на экран и возвращает некоторое ненулевое значение в случае успеха.

Зачем нужен спецификатор " %s "? Это делается для того, чтобы можно было выводить строки с любыми символами. Сравните:

Пример:

char str [] = " Захотелось мне вывести %d...";

printf (" %s", str); /* Правильный вариант */

printf (" \n"); /* Разделитель новой строки */

printf (str); /* Неправильный вариант */

В первом случае функция напечатает именно то, что от нее требуется. А вот во втором случае printf(), встретив в строке str спецификатор " %d" (ведь теперь эта строка – первая, значит, она задает формат вывода), сделает вывод, что за ней должно следовать число. А так как оно не следует, то вместо " %d " будет напечатан некоторый мусор – число, находящееся в тот момент в стеке.

Последствия могут быть и более серьезными, если в строке находится последовательность " %s", то сочтет ее за строку, и будет выводить ее до тех пор, пока не встретит нулевой символ. А где она его встретит, сколько успеет напечатать и не crash'нется ли из-за обращения не к своей памяти – не знает никто.

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

 

Пример: Необходимо сохранить введенную строку.

/*чтение строки с терминала*/

int getline(char s, / *введенная строка*/

int lim) /*ее максимальная длина*/

{ int c, i; /* с – вводимый символ*/

 

for (i=0; i< lim & & (c = getchar())! =EOF & & c! =’\n’; i++) {

s[i]=c; }

s[i] = ’\0’;

return i; }

 

 

9.5 Ввод–вывод строк. Основные функции работы со строками

 

Одной из наиболее популярных операций ввода-вывода является операция ввода-вывода строки символов. В библиотеку языка СИ для обмена данными через стандартные потоки ввода-вывода включены функции ввода-вывода строк gets() и puts(), которые удобно использовать при создании диалоговых систем.

Для ввода строки существует функция с прототипом

char *gets (char *string),

которая считывает строку с клавиатуры и помещает ее в буфер string, указатель на который и возвращает. Если произошла ошибка, то возвращается EOF.

Функция имеет только один аргумент – указатель s на массив символов. Прототип функции описан в файле < stdio.h>.

Функция gets() завершает свою работу при вводе символа ‘\n’, который автоматически передается с клавиатуры в ЭВМ при нажатии клавиши < Enter>. При этом сам символ ‘\n’ во вводимую строку не записывается. Вместо него в строку помещается нуль–символ ‘\0’. Таким образом, функция gets() производит ввод “правильной” строки, а не просто последовательности символов.

Здесь следует обратить внимание на следующую особенность ввода данных с клавиатуры. Функция gets() начинает обработку информации от клавиатуры только после нажатия клавиши < Enter>. Таким образом, она “ожидает”, пока не будет набрана нужная информация и нажата клавиша < Enter >. Только после этого начинается ввод данных в программу.

Пример: #include < stdio.h>

int main (void) {

char string[80];

printf (" Input a string: ");

gets (string);

printf (" The string input was: %s\n", string);

return 0; }

Функция puts() (вывод строки на экран) в случае успешного завершения возвращает последний выведенный символ, который всегда является символом ‘\n', если произошла ошибка, то возвращается из функции EOF. Прототип этой функции имеет следующий вид:

int puts (char*s); /*функция вывода строки*/

Функция имеет только один аргумент – указатель s на массив символов. Прототип функции описан в файле < stdio.h>.

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

 

#include< stdio.h>

char strl[ ] = ”введите фамилию сотрудника: ”;

int main () {

char name[80];

puts(strl0;

gets(name);

return 0; }

Напомним, что любая строка символов в языке СИ должна заканчиваться нуль–символом ‘\0’. В последний элемент массива strl нуль–символ будет записан автоматически во время трансляции при инициализации массива. Для функции puts() наличие нуль-символа в конце строки является обязательным.

В противном случае, т.е. при отсутствии в символьном массиве символа ‘\0’, программа может завершиться аварийно, т.к. функция puts() в поисках нуль-символа будет перебирать всю доступную память байт за байтом, начиная, в нашем примере, с адреса strl. Об этом необходимо помнить, если в программе происходит формирование строки для вывода ее на экран дисплея.

Пример: #include < stdio.h>

int main (void) {

char string[] = " This is an example output string\n";

puts(string);

return 0; }

 

 

9.5 Функции манипуляции со строками

 

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

Для манипуляций со строками существует набор функций, объявленных в файле < string.h> (те, кто пишет под Windows, могут включать вместо него файл < windows.h >).

Наиболее важные функции:

I. int strcmp (char *string1, char *string2)

осуществляет сравнение двух строк. Возвращает отрицательное число, если первая строка меньше второй, 0, если строки равны и положительное число, если первая строка больше второй. Более детально, функция возвращает разницу между кодами первых встретившихся неодинаковых символов (если строки неодинаковы по длине, то когда-то ненулевой символ будет сравниваться с нулем).

Пример:

#include < string.h>

#include < stdio.h>

int main (void) {

char *buf1 = " aaa", *buf2 = " bbb", *buf3 = " ccc";

int ptr;

ptr = strcmp (buf2, buf1);

if (ptr > 0)

printf(" buffer 2 is greater than buffer 1 \n");

else

printf(" buffer 2 is less than buffer 1 \n");

ptr = strcmp(buf2, buf3);

if (ptr > 0)

printf(" buffer 2 is greater than buffer 3\n");

else

printf(" buffer 2 is less than buffer 3\n");

return 0; }

На экране появится:

buffer 2 is greater than buffer 1

buffer 2 is less than buffer 3

 

II. char *strcpy (char *dest, char *source)

осуществляет копирование строки source на место строки dest. Опять-таки позаботьтесь о том, чтобы вся строка поместилась в отведенном для нее месте. Функция возвращает указатель на строку-приемник.

Пример: #include < stdio.h>

#include < string.h>

int main (void) {

char string[10];

char *str1 = " a b c d e f g h i";

strcpy (string, str1);

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

return 0; }

На экране появится: a b c d e f g h I

 

III. char *strcat (char *string1, char *string2)

осуществляет склеивание двух строк. Вторая строка добавляется в конец первой. Функция не проверяет (да и не может проверять технически) наличие необходимого количества памяти в конце первой строки – об этом должны позаботиться вы. Функция возвращает указатель на первую строку.

Пример:

#include < string.h>

#include < stdio.h>

int main(void) {

char destination[25];

char *blank = " ", *c = " C++", *turbo = " Turbo";

strcpy (destination, turbo); //Копирование строки " turbo"

на место destination

strcat (destination, blank); // Склеивание destination …

strcat (destination, c); // сначала с blank, потом с c

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

return 0; }

На экране появится: Turbo C ++

 

IV. int strlen (char *string)

возвращает длину строки string (не считая нулевого символа).

 

V. char *strdup (char *string)

создает дубликат строки string и возвращает указатель на него. Учтите, что в отличие от остальных функций, strdup сама создает строку и поэтому после того, как она стала вам не нужна, не забывайте ее освободить.

 

VI. char *strncpy (char *dest, char *source, int count)

VII. char *strncat (char *string1, char *string2, int count)

аналогично strcpy и strcat, но копируются только первые count символов. Функции не добавляют к строке завершающего нуля – вам придется сделать это самим.

 

VIII. char *strchr (char *string, int c)

IX. char *strstr (char *string, char *substring)

ищут первое вхождение в строку string соответственно символа c и подстроки substring. Обе функции возвращают адрес первого вхождения или NULL, если такового не найдено.

Пример:

int main (void) {

char string[15];

char *ptr, c = 'r';

//Создаем строку

strcpy (string, " This is a string");

ptr = strchr(string, c);

if (ptr)

printf(" The character %c is at position: %d\n", c, ptr-string);

else

printf(" The character was not found\n");

return 0; }

На экране появится: The character r is at position: 12



Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.013 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал