Char数组比较和while循环在C中无法正常工作

时间:2014-09-20 17:14:04

标签: c file-io while-loop strcmp strncpy

我有一个名为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. while循环4次。(应该只有两次,因为只有2条记录可以遍历。)
  2. 程序在if (id == empID)中有运行时错误。但当我用if (strcmp(id, empID) == 0)替换它时,答案是错误的。
  3. 更新strcmp现在正在运作。感谢@barak manos。 while循环4次仍然存在,但我得到了我想要的结果。

3 个答案:

答案 0 :(得分:2)

首先,char empID[5]char id[6]看起来很不合适。

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

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

请注意,strcmpstrcpystrlenprintf等字符串例程需要以空字符结尾的字符串作为输入。因此,您必须确保用于此目的的每个char数组足以存储输入文本以及另外的\0字符。

答案 1 :(得分:1)

您必须使用strcmp()来比较字符串。您需要比较两个变量是否具有相同的地址 - 而且他们不会。

请注意,empID的长度不足以使E0001保留空终止符;你应该在你的数组大小调整中保持一致。你的字符串长度为40,也非常小。我可能会使用4096作为行大小,并且如果所呈现的行实际上超过39或40则抱怨。将fgets(lineOfText, sizeof(lineOfText), fp)sizeof一起使用也是一个好主意。指定数组大小。这意味着如果要更改数组的大小,只需要更改一行代码 - 这就是数组的声明。

答案 2 :(得分: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?");
        }
    }