Язык Си - руководство для начинающих
Шрифт:
Функция gets предоставляет вам два способа ввода строки!
1. Использует метод указателей для передачи строки в name.
2. Использует ключевое слово return для возврата строки в ptr.
Напомним, что ptr является указателем на тип char. Это означает, что gets должна вернуть значение, которое является указателем на тип char. И в приведенном выше изложении вы можете увидеть, что мы так и описали gets.
Описание вида
char *gets;
говорит о
Между прочим, вы можете также описать указатель на функцию. Это выглядело бы следующим образом:
char (*foop);
и foop был бы указателем на функцию типа char. Мы расскажем немного подробнее о таких причудливых описаниях в гл. 14.
Структура функции gets выглядела бы примерно так:
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
Мы уже использовали ранее функцию 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– две рабочие лошадки, используемые при выводе строк.
Функция puts
Это очень простая функция; у нее есть только один аргумент, являющийся указателем строки. Нижеследующий пример иллюстрирует некоторые из многих способов ее применения.
/* простые выдачи */
#include <stdio.h>
#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.
Массив инициализирован мной.
Указатель инициализирован мной.
ив инициализирован мной.
атель инициализирован мной.