1

我无法弄清楚如何在 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 字符串函数。任何想法都会有所帮助。

4

2 回答 2

0

正如我在评论中所写的那样,我将编写的解决方案是将数据序列化为单个字符数组或将所有内容转换为数字以便于比较或使用字符数组数组和字符串逐一比较之间的一些选择。

在这些选项中,我认为序列化数据是最简单的,尽管它需要(至少)以下条件之一才能成为正确的解决方案:

  1. 常规数据,所有数据都具有完全相同的长度/类型
  2. 一个空格字符,用于标记一个数据项和另一个数据项之间的差异
  3. 某种结构(比单个空格字符更复杂,但具有相同的效果)

假设(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(...)调用终止。

于 2013-11-12T13:35:39.827 回答
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
于 2013-11-12T05:24:26.110 回答