0

我有这个名为 CheckEmployee 的函数。它打开一个文本文件并检查用户输入的 id 是否存在于记录中:

void CheckEmployee()
{
    system("CLS");
    char empID[5];

    printf("Key in Employee ID: ");
    scanf("%s", &empID);

    FILE *fp = fopen("Employees.txt", "r");
    char lineOfText[40];

    while (fgets(lineOfText, 40, fp))
    {
        char id[6];
        strncpy(id, lineOfText, 5);
        id[5] = 0;

        if (id == empID)
        {
            printf("Hello?");
        }
    }
    fclose(fp);
}

texfile 包含以下内容:

E0001de Guzman, Franz Miguel C.         
E0002de Guzman, Fernan Ralph C.         

每行 40 个字符,包括空格。问题是:

  1. 循环 4次while。(应该只有两次,因为只有 2 条记录要遍历。)
  2. 该程序在if (id == empID). 但是当我用 替换它时if (strcmp(id, empID) == 0),答案是错误的。

更新strcmp现在正在工作。感谢@barak manos。循环 4次while仍然存在,但我得到了我想要的结果。

4

3 回答 3

2

首先,你char empID[5]char id[6]输入看起来很短。

其次,表达式的值id == empID始终为假,因为您实际上是在比较两个静态分配的数组的内存地址。

该表达式strcmp(id,empID) == 0应该产生您正在寻找的结果,假设id数组empID足够大以存储您正在读入的文本。

请记住,诸如strcmp, strcpy,strlen之类的字符串例程需要以printf空字符结尾的字符串作为输入。因此,您必须确保char用于该目的的每个数组都足够大以存储输入文本和一个附加\0字符。

于 2014-09-20T17:23:13.813 回答
1

你必须用来strcmp()比较字符串。您正在比较您的两个变量是否具有相同的地址——而它们没有。

请注意,它的empID长度不足以容纳E0001空终止符;你应该在你的数组大小上保持一致。您的 40 行字符串长度也非常小。我可能会使用 4096 作为行大小,如果显示的行实际上比 39 或 40 长,我会抱怨。fgets(lineOfText, sizeof(lineOfText), fp)sizeof指定数组大小一起使用也是一个好主意。这意味着如果你想改变数组的大小,你只需要改变一行代码——这就是数组的声明。

于 2014-09-20T17:24:12.987 回答
0

你应该这样做:

 while (fgets(lineOfText, 40, fp))
    {
        char id[6];
        strncpy(id, lineOfText, 5);

        id[5] ='\0';  // add null to end of id.

        if (strcmp(id,empID)==0) // here compare string
        {
            printf("Hello?");
        }
    }
于 2014-09-20T18:04:33.190 回答