繁体   English   中英

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

[英]Char array comparing and while loop not working properly in C

我有一个名为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) ,答案为假。

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

首先, char empID[5]char id[6]看起来可疑地短于您的输入。

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

假设 idempID数组足够大,可以存储正在阅读的文本,则表达式strcmp(id,empID) == 0产生您要查找的结果。

请记住,字符串例程(例如strcmpstrcpystrlenprintf期望以空终止的字符串作为输入。 因此,您必须确保用于此目的的每个char数组都足够大以存储输入文本以及一个附加的\\0字符。

您必须使用strcmp()比较字符串。 您正在比较两个变量是否具有相同的地址-却没有。

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

你应该这样做:

 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?");
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM