程序未写入其他文件

时间:2019-03-25 17:27:35

标签: c tokenize

该程序应将用户的区号输入,搜索一个单独的文件,该文件在txt文件中列出了一堆电话号码,并且功能搜索应使用输入的区号测试电话号码看看是否匹配。然后,main函数将电话号码写入单独的txt文件中。

我尝试使用strstr,但是我想测试的最佳方法是使用strtokstrcmp,这就是我现在所拥有的。

/* 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 个答案:

答案 0 :(得分:1)

您的程序中存在多个问题:

  • 数组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,无需执行冗余测试。

    < / li>
  • search中的测试不正确:if (strcmp(area_code, phone_number) == 0)您应该将令牌与area_code进行比较:

        if (strcmp(area_code, pch) == 0)
    
  • read_line还有一个潜在的问题:其参数是要读取的最大字符数,这与fgets()的参数(目标数组的大小)不同。如果给函数sizeof area_code指定size参数,这会造成混乱,并且以后可能会导致错误。