字符数组比较和while循环在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. 程序在if (id == empID)中存在运行时错误。但当我用if (strcmp(id, empID) == 0)替换它时,答案是错误的

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

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

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

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

请记住,诸如strcmpstrcpystrlenprintf之类的字符串例程期望以null结尾的字符串作为输入。因此,您必须确保用于此目的的每个char数组都足够大,可以存储输入文本和一个额外的字符。

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

注意,CCD_ 19的长度不足以容纳具有空终止符的CCD_ 20;您的数组大小应该保持一致。你的绳子长度40也非常小。我可能会用4096作为线条大小,如果呈现的线条实际上长于39或40,我会抱怨。使用fgets(lineOfText, sizeof(lineOfText), fp)sizeof来指定数组大小也是一个好主意。这意味着,如果要更改数组的大小,只需更改一行代码——这就是数组的声明。

您应该这样做:

 while (fgets(lineOfText, 40, fp))
    {
        char id[6];
        strncpy(id, lineOfText, 5);
        id[5] ='';  // add null to end of id.
        if (strcmp(id,empID)==0) // here compare string
        {
            printf("Hello?");
        }
    }

相关内容

  • 没有找到相关文章

最新更新