用fgets读取一行strcmp

我试图比较两个string。 一个存储在一个文件中,另一个从用户(stdin)中获取。

这是一个示例程序:

int main() { char targetName[50]; fgets(targetName,50,stdin); char aName[] = "bob"; printf("%d",strcmp(aName,targetName)); return 0; } 

在这个程序中,当input是"bob"时, strcmp返回一个-1的值。 为什么是这样? 我认为他们应该是平等的。 我怎样才能得到它,所以他们是?

strcmp是less数几个具有相反结果的函数之一,如果string相等,结果为0,而不是像你想象的那样。

 if (strcmp(a, b)) { /* Do something here as the strings are not equal */ } else { /* Strings are equal */ } 

说到fgets ,有可能是在string的末尾附加了一个换行符…你需要摆脱它…

 +-+-+-+--+--+ |b|o|b|\n|\0| +-+-+-+--+--+ 

为了摆脱换行符做到这一点。 CAVEATS:不要使用“strlen(aName) – 1”,因为fgets返回的行可能以NUL字符开头 – 因此缓冲区的索引变为-1:

 aName[strcspn(aName, "\n")] = '\0'; +-+-+-+--+ |b|o|b|\0| +-+-+-+--+ 

现在, strcmp应该返回0 …

fgets读取直到看到一个换行符然后返回,所以当你键入bob时,在控制台中, targetName包含“bob \ n”,它不匹配“bob”。 从fgets文档:(大胆添加)

从stream中读取字符,并将它们作为Cstring存储到str中,直到(num-1)个字符被读取,或者到达换行符或文件结束时,以先到者为准。 换行符使fgets停止读取,但它被认为是有效的字符,因此它被包含在复制到str的string中。 读取字符后,空字符会自动添加到str中,以表示Cstring的结尾。

在比较之前,您需要从targetName的末尾删除换行符。

 int cch = strlen(targetName); if (cch > 1 && targetName[cch-1] == '\n') targetName[cch-1] = '\0'; 

或将新行添加到您的testingstring。

 char targetName[50]; fgets(targetName,50,stdin); char aName[] = "bob\n"; printf("%d",strcmp(aName,targetName)); 

因为fgets将换行符embedded到variablestargetName 。 这是抛弃比较。

fgets将\n添加到您按Enter键时从用户中拉出的string中。 你可以通过使用strcspn来解决这个问题,或者把\n添加到你想要比较的string的末尾。

 printf("Please enter put FILE_NAME (foo1, 2, or 3), ls, or exit: \n"); fgets(temp, 8, stdin); temp[strcspn(temp, "\n")] = '\0'; if(strcmp(temp, "ls") == 0 || strcmp(temp, "exit") == 0) 

这只是用\0代替\n ,但如果你想懒惰,你可以这样做:

 printf("Please enter put FILE_NAME (foo1, 2, or 3), ls, or exit: \n"); fgets(temp, 8, stdin); if(strcmp(temp, "ls\n") == 0 || strcmp(temp, "exit\n") == 0) 

但它不是那么优雅。

fgets将换行符附加到string中,所以您将以bob\n\0结尾,这与bob\n\0不一样。

主要是因为unix系统下input“\ n”中的字符行结束。