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