Основы программирования в Linux
Часть 130 из 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("\n\n");printf("1 - add new CD\n");printf("2 - search for a CD\n");printf("3 — count the CDs and tracks in the database\n");printf("q — quit\n");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_confirmstatic 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, поэтому отбросьте его:fgetsstatic int enter_new_cat_entry(cdc_entry *entry_to_update) {cdc_entry new_entry;char tmp_str[TMP_STRING_LEN + 1];memset(&new_entry, '\0', 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!gets10. Теперь вы переходите к функции
для ввода информации о дорожке. Эта функция немного сложнее функции ввода элемента каталога, поскольку вы разрешаете существующему элементу-дорожке оставаться неизменным:enter_new_track_entriesstatic 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] == '\0') return;printf("\nUpdating tracks for %s\n", 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 description\n");while(1) {