我有一个名为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个字符,包括空格。 问题是:
while
循环4次。(应该只有两次,因为只有2条记录可以遍历。)if (id == empID)
中有运行时错误。但当我用if (strcmp(id, empID) == 0)
替换它时,答案是错误的。 更新:strcmp
现在正在运作。感谢@barak manos。 while
循环4次仍然存在,但我得到了我想要的结果。
答案 0 :(得分:2)
首先,char empID[5]
和char id[6]
看起来很不合适。
其次,表达式id == empID
的值始终为false,因为您实际上是在比较两个静态分配的数组的内存地址。
表达式strcmp(id,empID) == 0
应该会产生您正在寻找的结果,假设 id
和empID
数组足够大以存储你正在读它们的文字。
请注意,strcmp
,strcpy
,strlen
,printf
等字符串例程需要以空字符结尾的字符串作为输入。因此,您必须确保用于此目的的每个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?");
}
}