Читать интересную книгу Язык Си - руководство для начинающих - M. УЭИТ

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 73 74 75 76 77 78 79 80 81 ... 98

собственный указатель. По соглашению, этот массив указателей называется argv (argument values). Если можно (некоторые операционные системы не позволяют этого), элементу argv[0] присваивается имя самой программы. В этом случае аргументу argv[l] присваивается первая следующая строка и т. д. Для нашего примера имеем

argv[0] ссылается на echo (для большинства систем)

argv[1] ссылается на я

argv [2] ссылается на мог

argv [6] ссылается на помощью

Поскольку вы используете эти обозначения, то можете легко проследить остаток программы.

РИС. 13.6. Аргументы командной строки.

Многие программисты используют для argv и другие обозначения:

main(arge, argv)

int arge;

char **argv;

Описание argv на самом деле эквивалентно char *аrgv[ ];. Читая его, вы могли бы сказать, что argv является указателем на указатель на типchar. Наш пример дает то же самое. У нас был массив из семи элементов. Имя массива является указателем на его первый элемент. Поэтому argv ссылается на argv[0], a argv[0] является указателем на тип char. Следовательно, даже с исходным определением argv является указателем на указатель на тип char. Вы можете использовать любую из этих форм, но видно, что первая проще для понимания.

     Очень часто аргументы командных строк используются для указания возможностей программы. Например, можно применять комбинацию символов - r, чтобы заставить программу выполнять сортировку в обратном порядке. Обычно альтернативы задаются при помощи дефиса и буквы, как - r. Эти "флажки" ничего нс означают в языке Си; вы должны сами запрограммировать их распознавание.

Вот очень простой пример, показывающий, как программа может проверять и использовать флажок.

/* обычное начало */

#define YES 1

#define NO  0

main(argc, argv)

int argc;

char *argv[ ];

{

float array[100];

int n;

int flag = NO;

if(argv[l][0] == '-' && argv[l][l] == 'r')

     flag = YES;

...

if flag = NO

     sort1(array, n);

else

sort2(array, n);

...

}

Эта программа проверяет первую строку после имени командного файла, чтобы посмотреть, начинается ли она с дефиса. Затем она проверяет, является ли следующий символ кодом буквы r. Если это так, то устанавливается флажок, приводящий к использованию другой программы сортировки. Строки после первой игнорируются. Как мы уже сказали, этот пример достаточно прост.

     Если вы использовали систему UNIX, то, вероятно, заметили, что команды UNIX предоставляют разнообразные варианты командной строки и ее аргументов. Эти примеры показывают, как использовать аргументы командной строки языка Си, поскольку большая часть системы UNIX написана на языке Си.

Аргументы командных строк могут быть также именами файлов, и вы можете использовать их вместо операторов переключения, чтобы указать программе, над какими файлами надо работать. Мы покажем вам, как это делается, в гл. 15.

ЧТО ВЫ ДОЛЖНЫ БЫЛИ УЗНАТЬ В ЭТОЙ ГЛАВЕ

Как объявить строку символов: static char fun[ ] и т. д.

Как инициализировать строку символов: static char *p0 = "0!"

Как использовать gets( ) и puts( )

Как использовать strlen( ), strcmp( ), strcpy( ) и strcatf( )

Как использовать аргументы командной строки.

В чем сходство и различие описателей char *bliss и char bliss[ ]

Как создать строковую константу: "используя кавычки".

ВОПРОСЫ И ОТВЕТЫ

Вопросы

1. Что неправильно в этой попытке описания символьной строки?

main( ) {

char name[ ] = {'F', 'с', 's', 's'};

2. Что напечатает эта программа?

#include <stdio.h>

main( )

{

static char note[ ] = "До встречи в буфете." ;

char *ptr;

ptr = note;

puts(ptr);

puts(++ptr);

note[7] = '';

puts(note);

puts(++ptr);

}

3. Что напечатает эта программа?

main( )

{ static char food[ ] = "Йумми";

char *ptr;

ptr = food + strlen(food);

while(--ptr >= food) puts(ptr);

}

4. Что напечатает нижеследующая программа?

main( )

{

static char goldwyn[28] = " аз я считываю"

static char samuel[40] = " Каждый р" ;

char *quote = " часть строки."

strcat(goldwyn, quote);

strcat(samuel, goldwyn);

puts(samuel);

}

5. Создайте функцию, которая использует указатель строки в качестве аргумента и возвращает указатель, ссылающийся на первый пробел в строке в указанном месте или после него. Если она не находит ни одного пробела, то пусть возвращает NULL-указатель.

Ответы

1. Класс памяти должен быть extern или static; инициализация должна включать символ ''.

2.

До встречи в буфете.

    о встречи в буфете.

 До вст

    вст

3.

и

 ми

    мми

 умми

    Йумми

4.

Каждый раз я считываю часть строки.

5.

char *strblk(string)

char *string; {

while(*string != ' ' && *string != '')

 string++;  /* останавливается на первом пробеле или нуль-символе */

if(*string == '')

 return(NULL);  /* NULL = 0 */

else return(string); }

УПРАЖНЕНИЯ

1. Создайте функцию, которая считывает очередные n символов при вводе, включая символы пробелов, табуляции и новой строки.

2. Модифицируйте последнюю функцию таким образом, чтобы она останавливалась после ввода n символов или после первого символа пробела, табуляции или но вой строки независимо от того, какой из них идет первым [только не используйте функцию scanf( )].

3. Создайте функцию, которая считывает очередное слово при вводе; определите слово как последовательность символов, не включающую символы пробела, табуляции или новой строки.

4. Создайте функцию, которая ищет первое появление определенного символа в определенной строке. Функция должна возвращать указатель, ссылающийся на этот символ, в случае успешного поиска или NULL, если символ в строке не найден.

14. Структуры и другие типы данных

СТРУКТУРЫ ДАННЫХ

СТРУКТУРНЫЕ ШАБЛОНЫ, ТЕГИ И ПЕРЕМЕННЫЕ

ДОСТУПНЫЕ ЧАСТИ СТРУКТУРЫ

СТРУКТУРНЫЕ УКАЗАТЕЛИ

СТРУКТУРНЫЕ МАССИВЫ

ФУНКЦИИ И СТРУКТУРЫ

ОБЪЕДИНЕНИЯ

СОЗДАНИЕ НОВЫХ ТИПОВ

КЛЮЧЕВЫЕ СЛОВА struct, union, typedef

ОПЕРАЦИИ ->

     Успех программы часто зависит от удачного выбора способа представления данных, с которыми она должна работать. В этом отношении языку Си очень повезло (и не случайно), так как он обладает очень мощными средствами представления сложных данных. Этот тип данных, называемых "структурой", не только достаточно гибок для представления разнообразных данных, но, кроме того, он позволяет пользователю создавать новые типы. Если вы знакомы с "записями" языка Паскаль, вам должны быть удобны структуры.

Посмотрим на конкретном примере, почему структуры нам необходимы и как их создавать и использовать.

ТИПОВАЯ ЗАДАЧА: ИНВЕНТАРИЗАЦИЯ КНИГ

     Гвен Гленн хочет напечатать опись своих книг. Она хотела бы занести в нее различную информацию о каждой книге: ее название, фамилию автора, издательство, год издания, число страниц, тираж и цену. Теперь некоторые из этих элементов, такие, как название, можно записать в массив строк. Другие элементы требуют массив целого типа или массив типа float. Если работать с семью различными массивами и следить за веси содержащейся в них информацией, можно сойти с ума, особенно если Гвен желает иметь несколько списков - список, упорядоченный по названиям, список, упорядоченный по авторам, по цене и т. д. Гораздо лучше было бы использовать один массив, в котором каждый элемент содержал бы всю информацию о книге.

     Но какой тип данных может содержать строки и числа одновременно и как-то хранить эту информацию раздельно? Ответом должна быть, конечно, тема данной главы - структура. Чтобы посмотреть, как создается структура и как она работает, начнем с небольшого примера. Для упрощения задачи введем два ограничения: первое - мы включим в опись только название книги, фамилию автора и цену; второе - ограничим опись до одной книги. Если у вас больше книг, не беспокойтесь; мы покажем, как расширить эту программу.

1 ... 73 74 75 76 77 78 79 80 81 ... 98
На этом сайте Вы можете читать книги онлайн бесплатно русская версия Язык Си - руководство для начинающих - M. УЭИТ.
Книги, аналогичгные Язык Си - руководство для начинающих - M. УЭИТ

Оставить комментарий