char *gets(s);
char *s;
{
char *p;
return(p);
}
На самом деле структура немного сложнее, и для gets( )есть две возможности возврата. Если все идет хорошо, она возвращает считанную строку, как мы уже сказали. Если что-то неправильно или если gets( )встречает символ EOF, она возвращает NULL, или нулевой адрес. Таким образом gets( )включает разряд проверки ошибки. Поэтому данная функция удобна для использования в конструкциях, подобных
while(gets(name) != NULL)
где NULLопределен в файле stdio.hкак 0. При помощи указателя массиву name присваивается значение. Наличие возвратапозволяет присваивать значение всей gets(name)и выполнять проверку на EOF. Этот двоякий подход более компактен, чем использование функции getchar( ), которая имеет возвратбез аргумента.
while((ch = getchar( )) != EOF)
Мы уже использовали ранее функцию scanf( )и формат %sдля считывания строки. Основное различие между scanf( )и gets( )заключается в том, как они определяют, что достигли конца строки: scanf( )предназначена скорее для получения слова, а не строки. Функция gets( ), как мы уже видели, принимает все символы до тех пор, пока нс встретит первый символ "новая строка". Функция scanf( )имеет два варианта. Для любого из них строка начинается с первого встретившегося непустого символа. Если вы используете формат %s, строка продолжается до (но не включая) следующего пустого символа (пробел, табуляция или новая строка). Если вы определяете размер поля как %10s, то функция scanf( )считает нe более 10 символов или же считает до любого пришедшего первым пустого символа.
Функция scanf( )возвращает целое значение, равное числу счи танных символов, если ввод прошел успению, или символ EОF, ее ли он встретился.
/* scanf( ) и подсчет количества */
main( )
{
static char name1[40], name2[11];
int count;
printf(" Введите, пожалуйста, 2 имени.\n");
count = scanf(" %s %10s", name1, name2);
printf(" Я считал %d имен %s и %s.\n", count, name1, name2);
}
Вот два примера работы программы:
Введите, пожалуйста, два имени.
Джсссика Джукс.
Я считал два имени
Джсссика и Джукс.
Введите, пожалуйста, 2 имени.
Лиза Апплеботтхэм
Я считал 2 имени Лиза и Апплеботтхэм.
Во втором примере были считаны только первые 10 символов от Апплеботтхэм, так как мы использовали формат %10s.
Если вы получаете только текст с клавиатуры, лучше применять, функцию gets( ). Она проще в использовании, быстрее и более компактна. Функция scanf( )предназначена в основном для ввода смеси типов данных в некоторой стандартной форме. Например, если каждая вводимая строка содержит наименование инструмента, количество его на складе и стоимость каждого инструмента, вы можете использовать функцию scanf( )или можете создать свою собственную функцию, которая выполняет проверку некоторых ошибок при вводе.
Опять мы должны полагаться на библиотечные функции, которые могут немного изменяться от системы к системе. Функции puts( )и printf( )- две рабочие лошадки, используемые при выводе строк.
Это очень простая функция; у нее есть только один аргумент, являющийся указателем строки. Нижеследующий пример иллюстрирует некоторые из многих способов ее применения.
/* простые выдачи */
#include
#define DEF "Я строка #define."
main( )
{
static char str1[ ] = "Массив инициализирован мной.";
static char *str2 = "Указатель инициализирован мной.";
puts(" Я аргумент функции puts( )." );
puts(DEF);
puts(str1);
puts(str2);
puts(&str1[4]);
puts(str2 + 4);
}
В результате работы программы получаем
Я аргумент функции puts( ).
Я строка #define.
Массив инициализирован мной.
Указатель инициализирован мной.
ив инициализирован мной.
атель инициализирован мной.
Этот пример напоминает нам, что фразы в кавычках и имена строк символьных массивов являются указателями. Обратите внимание на два последних оператора. Указатель &strl[4]ссылается на пятый элемент массива str1. Этот элемент содержит символ 'и', и функция puts( )использует его в качестве начальной точки. Аналогично str2 + 4ссылается на ячейку памяти, содержащую 'а' в "указателе", и с нее начинается вывод строки.
Читать дальше