Читать интересную книгу Основы программирования в Linux - Мэтью Нейл

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 126 127 128 129 130 131 132 133 134 ... 324

    break;

   case '5':

    option_chosen = mo_del_cat;

    break;

   case '6':

    option_chosen = mo_list_cat_tracks;

    break;

   case 'q':

    option_chosen = mo_exit;

    break;

   }

  } else {

   printf("nn");

   printf("1 - add new CDn");

   printf("2 - search for a CDn");

   printf("3 — count the CDs and tracks in the databasen");

   printf("q — quitn");

   printf("nOption: ");

   fgets(tmp_str, TMP_STRING_LEN, stdin);

   switch(tmp_str[0]) {

   case '1':

    option_chosen = mo_add_cat;

    break;

   case '2':

    option_chosen = mo_find_cat;

    break;

   case '3':

    option_chosen = mo_count_entries;

    break;

   case 'q':

    option_chosen = mo_exit;

    break;

   }

  }

 } /* while */

 return(option_chosen);

}

Примечание

Учтите, что для выбора пунктов меню теперь используются номера, а не начальные буквы, применявшиеся в двух предыдущих примерах.

8. В программе есть несколько участков, в которых хотелось бы спросить пользователя о том, уверен ли он в своем запросе. Вместо того чтобы вставлять в эти места программный код, задающий вопрос, поместим его в отдельную функцию get_confirm:

static int get_confirm(const char *question) {

 char tmp_str[TMP_STRING_LEN + 1];

 printf("%s", question);

 fgets(tmp_str, TMP_STRING_LEN, stdin);

 if (tmp_str[0] == 'Y' || tmp_str[0] = 'y') {

  return(1);

 }

 return(0);

}

9. Функция enter_new_cat_entry позволяет вводить новый элемент каталога. Вам не нужно сохранять перевод строки, который возвращает функция fgets, поэтому отбросьте его:

static int enter_new_cat_entry(cdc_entry *entry_to_update) {

 cdc_entry new_entry;

 char tmp_str[TMP_STRING_LEN + 1];

 memset(&new_entry, '', sizeof(new_entry));

 printf("Enter catalog entry: ");

 (void)fgets(tmp_str, TMP_STRING_LEN, stdin);

 strip_return(tmp_str);

 strncpy(new_entry.catalog, tmp_str, CAT_CAT_LEN - 1);

 printf("Enter title: ");

 (void)fgets(tmp_str, TMP_STRING_LEN, stdin);

 strip_return(tmp_str);

 strncpy(new_entry.title, tmp_str, CAT_TITLE_LEN - 1);

 printf("Enter type: ");

 (void)fgets(tmp_str, TMP_STRING_LEN, stdin);

 strip_return(tmp_str);

 strncpy(new_entry.type, tmp_str, CAT_TYPE_LEN - 1);

 printf("Enter artist: ");

 (void)fgets(tmp_str, TMP_STRING_LEN, stdin);

 strip_return(tmp_str);

 strncpy(new_entry.artist, tmp_str, CAT_ARTIST_LEN - 1);

 printf("nNew catalog entry entry is :-n");

 display_cdc(&new_entry);

 if (get_confirm("Add this entry ? ")) {

  memcpy(entry_to_update, &new_entry, sizeof(new_entry));

  return(1);

 }

 return(0);

}

Примечание

Обратите внимание на то, что вы не применяете функцию gets, поскольку нет способа проверить переполнение буфера. Всегда избегайте применения функции gets! 

10. Теперь вы переходите к функции enter_new_track_entries для ввода информации о дорожке. Эта функция немного сложнее функции ввода элемента каталога, поскольку вы разрешаете существующему элементу-дорожке оставаться неизменным:

static void enter_new_track_entries(const cdc_entry *entry_to_add_to) {

 cdt_entry new_track, existing_track;

 char tmp_str[TMP_STRING_LEN + 1];

 int track_no = 1;

 if (entry_to_add_to->catalog[0] == '') return;

 printf("nUpdating tracks for %sn", entry_to_add_to->catalog);

 printf("Press return to leave existing description unchanged, n");

 printf(" a single d to delete this and remaining tracks, n");

 printf(" or new track descriptionn");

 while(1) {

1 ... 126 127 128 129 130 131 132 133 134 ... 324
На этом сайте Вы можете читать книги онлайн бесплатно русская версия Основы программирования в Linux - Мэтью Нейл.

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