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

Выводиться строка может или уже известной вам функцией 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









Дата добавления: 2015-06-10; просмотров: 3049;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

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

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.029 сек.