我无法弄清楚如何在C中读取数组。我正在尝试将用户输入与数组的部分进行匹配。该数组由文本文件填充,如下所示:
1754
1350
等等。目前,阵列中总共有8个四位数字。我希望能够将更多这些数字添加到文本文件中,并且仍然能够使用相同的代码通过用户输入扫描数组。这是我正在处理的代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/*this is to test strings*/
int main ()
{
FILE* spEmployees;
printf("Enter the code:");
char A[100];
scanf("%c", A);
char empNum[100];//stores empolyee numbers
spEmployees = fopen("Employees.txt", "r");
if (spEmployees == NULL)
{
printf("fail\n");
}
else
{
int num_lines = 0;
while ( !feof (spEmployees) && fgets(empNum, 99, spEmployees ))
{
printf("%s", empNum);
num_lines ++;
}
}
fclose(spEmployees);
getchar();
return 0;
}
所以现在我没有任何东西来扫描或比较阵列。这适用于从数组的文本文件中获取信息并读取用户输入。我已经尝试了几乎所有的标准C字符串函数。任何想法都会有所帮助。
答案 0 :(得分:0)
你想做这两件事,对吧?:
以下代码包含这两项功能(注意评论):
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/*this is to test strings*/
int main ()
{
FILE* spEmployees;
char A[100];
char *A_ptr = &A[0];
char empNum[100];//stores empolyee numbers
printf("Enter the code:");
scanf("%s", A_ptr);
spEmployees = fopen("Employees.txt", "r+"); // read/update
if (spEmployees == NULL)
{
printf("fail\n");
}
else
{
int num_lines = 0;
while ( !feof (spEmployees) && fgets(empNum, 99, spEmployees ))
{
printf("%s", empNum);
num_lines ++;
}
// "the ability to add more of these numbers into the text file"
fprintf(spEmployees, A);
// adding a new-line char to the file so the next number
// will be written in the next line
fprintf(spEmployees, "\n");
}
fclose(spEmployees);
getchar();
return 0;
}
注意该文件必须是这样的:
1754
1350
^
After writing manually `1350` to the file you need to go to the next line
so the program will write the new (entered) value to the file at the beginning
of the new line instead of continuing the 2nd:
1754
13502013 // like this
答案 1 :(得分:0)
正如我的评论中所说,我要编写的解决方案是将数据序列化为单个字符数组或将所有内容转换为数字以便于比较或使用字符数组数组和字符串逐个比较的一些选项
在这些选项中,我认为序列化数据将是最简单的,尽管它需要(至少)以下条件之一才能成为正确的解决方案:
假设(1)是这种情况并且数据作为4个字符的字符串到达以及用户的输入限制为4个字符,我可能会写
#define MAX_ITEMS 100
#define ITEM_SIZE 4
...
char fullSet[MAX_ITEMS*ITEM_SIZE+1];
int num_lines = 0;
while (!feof (spEmployees) && fgets(empNum, 99, spEmployees) && num_lines < MAX_ITEMS) {
printf("%s", empNum);
snprintf(&(fullSet[num_lines*ITEM_SIZE]), ITEM_SIZE+1, "%s", empNum);
num_lines++;
}
char *idx = strstr(fullSet, A);
int isMatch = 0;
if (idx != NULL) {
if ((int)(fullSet-idx) % ITEM_SIZE == 0)
isMatch = 1;
}
// do something with having found a match...
曾经在(1)中做过假设,并选择覆盖字符串中的分隔NULL
字符以使数学更容易,我唯一需要做的就是确保我没有得到作为匹配的一个字符串的一部分与另一个字符串的一部分是确定strstr
的结果是否从序列化中的一个项目的“开头”开始。当然,我没有检查A
是否包含比ITEM_SIZE
更长或更短的字符串,但这应该很容易理解。
此特定序列化的一个隐藏功能是strstr
将在整个fullSet
变量中搜索A
的实例,而不是在第一个条目后因NULL
而停止条目之间的终止。请注意,fullSet
中的最后一个条目仍会在上一次NULL
来电中终止snprintf(...)
。