Программа не пишет в другой файл - PullRequest
1 голос
/ 25 марта 2019

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

Я пытался использовать strstr, но я решил, что лучший способ проверить это - использовать strtok и strcmp,это то, что у меня сейчас.

/* This program will search phone_numbers.txt for phone numbers. It will create a new file with unique area codes in each file.
    (Ex: 813 area codes will go into 813_phone_numbers file).
    --Brandon Yates
*/

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

int search(char *area_code, char *phone_number);
int read_line(char *str, int n);

int main() {
    char area_code[3];
    char phone_number[101];
    char *file_name;
    FILE *number_file;
    FILE *new_file;

    printf("Enter the area code: ");
    scanf("%s", &area_code);
    //area_code = &ac;
    read_line(area_code, 2);

    number_file = fopen("phone_numbers.txt", "r");
    if (number_file == NULL) {
        printf("Cannot open file.\n");
        return -1;
    }

    new_file = fopen("dest_file.txt", "a");
    if (new_file == NULL) {
        printf("Cannot open file.\n");
        return -1;
    }

    //scat = strcat(area_code, file_name);

    while (fgets(phone_number, sizeof(phone_number), number_file) != NULL && !feof(number_file) && !ferror(number_file)) {
        if (search(area_code, phone_number))
            fputs(phone_number, new_file);
    }

    fclose(number_file);
    fclose(new_file);

    printf("Output: encoded words are written to file %s", file_name);

    return 0;
}

/*
    Search function determines if a phone number in the input file
    matches the area code.

    Search function returns 1 if the phone number matches the area code
    and 0 otherwise.
*/
int search(char *area_code, char *phone_number) {
    printf("testing");
    char *pch;
    pch = strtok(phone_number, "()");
    while (pch != NULL) {
        if (strcmp(area_code, phone_number) == 0)
            return 1;
        pch = strtok(NULL, "()");
    }
    return 0;
}

int read_line(char *str, int n) {
    int ch;
    int i = 0;

    while ((ch = getchar()) != '\n') {  
        if (i < n) { 
            *str++= ch;
            i++;
        }
    }
    *str = '\0';   /* terminates string */
    return i;      /* number of characters stored */
}

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

1 Ответ

1 голос
/ 25 марта 2019

В вашей программе несколько проблем:

  • массив area_code слишком мал: он может содержать только строки из 0, 1 или 2 символов. Поскольку вы не говорите scanf() ограничивать ввод максимум 2 символами, код области, введенный пользователем, заполняет массив, а scanf изменяет память за пределами конца массива, вызывая неопределенное поведение.

  • вы читаете ввод пользователя дважды в массив area_code. Первый раз с scanf(), который может вызвать неопределенное поведение, но оставляет новую строку ожидающей в стандартном вводе, а затем с read_line(), которая читает ожидающую новую строку и делает area_code пустой строкой ...

    Увеличьте area_code и сообщите scanf() о максимальном количестве символов для хранения или просто используйте read_line():

        char area_code[10];
        ...
        if (scanf("%9s", area_code) != 1)
            return 1;
    
  • Обратите внимание, что fgets(phone_number, sizeof(phone_number), number_file) != NULL && !feof(number_file) && !ferror(number_file) является избыточным: fgets() вернет NULL при ошибке и / или конце файла, нет необходимости выполнять избыточные тесты.

  • Тест в search неверен: if (strcmp(area_code, phone_number) == 0) вместо этого вы должны сравнить токен с area_code:

        if (strcmp(area_code, pch) == 0)
    
  • read_line также имеет потенциальную проблему: его аргумент - это максимальное количество символов для чтения, которое отличается от аргумента fgets(), который является размером целевого массива. Это сбивает с толку и может привести к ошибкам позже, если для функции задано значение sizeof area_code.

...