Запись в файл и использование if с циклами - PullRequest
0 голосов
/ 27 апреля 2018

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

#include <stdio.h>
#include <string.h>

int get_line(const char *prompt, char *dest, size_t size) {
  printf("%s", prompt);
  fflush(stdout);
  if (fgets(dest, size, stdin) == NULL) {
    dest[0] = '\0';
    return 0;
  }
  dest[strcspn(dest, "\n")] = '\0';  // Lop off potential trailing '\n'
  return 1;
}

int main(void) 
{
    char first_name[20], surname[20], street_no[10], street_name[40], postcode[10], contact_no[20], save_edit_qu[10];
    int dd, mm, yy;
    get_line(" Enter first name:\n", first_name, sizeof first_name);
    get_line(" Enter surname:\n", surname, sizeof surname);
    get_line(" Contact Number\n", contact_no, sizeof contact_no);
    get_line(" Street Number\n", street_no, sizeof street_no);
    get_line(" Street Name\n", street_name, sizeof street_name);
    get_line(" Postcode\n", postcode, sizeof postcode);

    printf(" First Name : %s\n", first_name);
    printf(" Surname    : %s\n", surname);
    printf(" Contact No.: %s\n", contact_no);
    printf(" Street No. : %s\n", street_no);
    printf(" Stret Name : %s\n", street_name);
    printf(" Postcode   : %s\n", postcode);


    get_line(" If the informations above is correct please enter SAVE/if you wish to change any informations please enter edit", save_edit_qu, sizeof save_edit_qu);
    if (save_edit_qu[0] == 'SAVE' || save_edit_qu[0] == 'save') {
    //write info to file
    }
    if (save_edit_qu[0] == 'EDIT' || save_edit_qu[0] == 'edit') {
    //loop back to beginning of report
    }
    else if ()//loop to beginning of SAVE/EDIT QU

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Итак, в вашей программе есть несколько ошибок. Я постараюсь охватить их все здесь, прежде чем я покажу вам изменения.

  1. Ваше сравнение строк просто бессмысленно: save_edit_qu[0] == 'SAVE' просто сравнивает первый символ / байт save_edit_qu с 'SAVE', что само по себе не является правильным строковым литералом. Вы должны заключить строковые литералы в двойные кавычки в C. И даже если вы сделали это здесь, сравнивать символ со строкой не имеет смысла. Что вы должны сделать, это использовать strcmp из string.h, чтобы сделать сравнение для вас. Я поместил это в мою фиксированную версию вашей программы. Формат: strcmp(a,b) == 0, если строка a равна строке b.

  2. Вы даете пользователям возможность редактировать все свои входные данные. Поэтому вы должны поместить свой сбор данных в цикл. Это позволяет вам постоянно повторно собирать данные, пока пользователь этого не сделает.

    do { // collect data. } while (!done);

  3. Наконец, вы заставляете пользователей выполнять действие в цикле сбора данных, чтобы они могли выбирать, что они хотели бы делать с данными. Они могут либо редактировать, либо сохранять. Там также дело, в которое они не входят ни. В этом случае им будет предложено снова. Это гарантирует еще один цикл управления внутри.

    do {
        // collect data
        do {
            // save or edit
        } while (!validChoice);
    
    } while (!done);
    

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

#include <stdio.h>
#include <string.h>

int get_line(const char *prompt, char *dest, size_t size) {
  printf("%s", prompt);
  fflush(stdout);
  if (fgets(dest, size, stdin) == NULL) {
    dest[0] = '\0';
    return 0;
  }
  dest[strcspn(dest, "\n")] = '\0';  // Lop off potential trailing '\n'
  return 1;
}

int main(void) 
{
    char first_name[20], surname[20], street_no[10], street_name[40], postcode[10], contact_no[20], save_edit_qu[10];
    int dd, mm, yy, done = 0;

    // Data collection loop: Runs as long as the user opts to edit the data.
    do {

        // Fetch data.
        get_line(" Enter first name:\n", first_name, sizeof first_name);
        get_line(" Enter surname:\n", surname, sizeof surname);
        get_line(" Contact Number\n", contact_no, sizeof contact_no);
        get_line(" Street Number\n", street_no, sizeof street_no);
        get_line(" Street Name\n", street_name, sizeof street_name);
        get_line(" Postcode\n", postcode, sizeof postcode);

        printf(" First Name : %s\n", first_name);
        printf(" Surname    : %s\n", surname);
        printf(" Contact No.: %s\n", contact_no);
        printf(" Street No. : %s\n", street_no);
        printf(" Stret Name : %s\n", street_name);
        printf(" Postcode   : %s\n", postcode);

        // Action loop: Runs as long as no valid input is given.
        do {
            get_line(" If the informations above is correct please enter SAVE/if you wish to change any informations please enter edit\n", save_edit_qu, sizeof save_edit_qu);

            // Option to quit.
            if (strcmp(save_edit_qu, "SAVE") == 0 || strcmp(save_edit_qu, "save") == 0) {
                fprintf(stdout, "Writing data to file...\n");
                // write data here.

                // Set done flag, and exit action loop.
                done = 1;
                break;
            }

            // Option to edit.
            if (strcmp(save_edit_qu, "EDIT") == 0 || strcmp(save_edit_qu, "edit") == 0 ) {

                //loop back to beginning of report
                break;
            }

            // Otherwise ask prompt again ^.
        } while (1);

    } while (!done);


    return 0;
}
0 голосов
/ 27 апреля 2018

используйте strcmp () и используйте двойные кавычки "" для строки!

if (strcmp(save_edit_qu,"SAVE") == 0 || strcmp(save_edit_qu,"save") == 0) {

или проверить только первый символ, используя одинарные кавычки, как этот

if (save_edit_qu[0] == 'S' || save_edit_qu[0] == 's') {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...