该程序应将用户的区号输入,搜索一个单独的文件,该文件在txt文件中列出了一堆电话号码,并且功能搜索应使用输入的区号测试电话号码看看是否匹配。然后,main
函数将电话号码写入单独的txt文件中。
我尝试使用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 = ∾
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 */
}
我希望电话号码被写入文本文件,但是最终我得到一个空文件。发生了什么事?
答案 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
,无需执行冗余测试。
search
中的测试不正确:if (strcmp(area_code, phone_number) == 0)
您应该将令牌与area_code
进行比较:
if (strcmp(area_code, pch) == 0)
read_line
还有一个潜在的问题:其参数是要读取的最大字符数,这与fgets()
的参数(目标数组的大小)不同。如果给函数sizeof area_code
指定size参数,这会造成混乱,并且以后可能会导致错误。