Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中扫描数组的各个部分以匹配用户输入_C_Arrays_String - Fatal编程技术网

如何在C中扫描数组的各个部分以匹配用户输入

如何在C中扫描数组的各个部分以匹配用户输入,c,arrays,string,C,Arrays,String,我在计算如何读取C中的数组时遇到困难。我正在尝试将用户输入与数组的部分匹配起来。数组由如下所示的文本文件填充: 1754 1350 等等。到目前为止,数组中总共有8个四位数。我希望能够将这些数字中的更多数字添加到文本文件中,并且仍然能够使用相同的代码扫描带有用户输入的数组。以下是我正在编写的代码: #include <stdio.h> #include <string.h> #include <stdlib.h> /*this is to test str

我在计算如何读取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字符串函数。任何想法都会有帮助。

你想做这两件事,对吗

在文本中添加更多这些数字的能力 使用相同的代码扫描带有用户输入的数组。 下面的代码包括这两种能力,请注意注释:


在我的评论中,我要写的解决方案是将数据序列化为单个字符数组,或者将所有内容转换为数字以便于比较,或者使用字符数组数组和字符串逐个比较

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

常规数据,所有数据的长度/类型完全相同 一种间距字符,用于标记一个数据项与另一个数据项之间的差异 一种比单个空格字符更复杂但效果相同的结构 假设是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中做过假设,并选择覆盖字符串中分隔的空字符以简化计算,要确保一个字符串的一部分与另一个字符串的一部分不匹配,我需要做的唯一一件事是确定strstr的结果是否从序列化中某个项的开头开始。当然,我没有检查A是否包含比ITEM_SIZE长或短的字符串,但这应该很容易理解


此特定序列化的一个隐藏特性是,strstrstr将在整个fullSet变量中搜索的实例,而不是在第一个条目之后停止,因为条目之间的终止为NULL。请注意,fullSet中的最后一个条目仍将具有来自最后一个snprintf的终止NULL。。。呼叫。

scanf%c,。。。查找来自用户的单个字符输入,对吗?不,来自用户的输入应该是4个字符,在这种情况下,它实际上是整数,但我将它们存储在一个字符中,以便能够比较它们。scanf是否有多个字符的问题?那么您应该使用scanf%s,a;。为了搜索整个数组是否匹配用户的输入,考虑将所有文件字符串放入单个长字符数组中,并使用STRSTR搜索它。或者B在将每个文件项存储到数组之前将其转换为一个数字,并将用户的a输入转换为一个数字以尝试匹配,或者C从文件中获得一个字符串数组,并对每个文件项使用strstr来查找匹配…@master Ok,已切换。现在效果更好了你对输入的代码什么都没做?它看起来就像问题中代码的副本。。。我不认为OP对将用户代码打印到文件中有任何兴趣。@abiessu,稍后请参阅我将解释的PS。目前,我可以说没有写入文件,文件是以只读模式打开的。我现在真的没有时间,待会儿见:我认为网站的一个指导方针是在评论中要求澄清,而不是在回答中要求澄清。撇开这一点不谈,很容易看出三行更改/添加的代码实现了引用的修复。我不太清楚的是,为什么你引用了整个原始代码并在其中进行了更改,而不是只引用了更改/添加内容以及几行上下文…@abiessu,我认为这没有多大意义。无论如何,我的时间太少,无法格式化文本,因此只会更改/添加行。完整的代码看起来比片段更好。谢谢你的关注:以后我只会发布修改过的\添加过的代码行。我不是建议你这么做,因为你确实为一篇文章提供了一个答案,而这个答案实际上可能与所问的问题相关。我的评论旨在鼓励我认为你的答案有所改进…谢谢。abiessu我用你的建议和strstr来比较这两种刺痛。这可以工作并允许进一步进入文件以展开它。我还使用atoi检查它们,这样atoiA和atoiempNum就可以 使用他们,因为我会标准化一个int这个工程,但程序不能顺利退出,我让它写一个时间戳的数字,用户输入到一个文件。它确实打印到文件中,但随后崩溃而不是顺利退出,为此我可能不得不问另一个问题。
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
#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...