用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”中的字符行结束。