用fgets读取的行上的strcmp

用fgets读取的行上的strcmp

我想比较两个字符串。一个存储在一个文件中,另一个从用户(stdin)中检索。

这是一个示例程序:

int main(){
    char targetName[50];
    fgets(targetName,50,stdin);

    char aName[] = "bob";
    printf("%d",strcmp(aName,targetName));

    return 0;}

在此程序中,strcmp输入时返回值-1 "bob"。为什么是这样?我认为他们应该是平等的。我怎样才能得到它们呢?



慕工程0101907
浏览 716回答 3
3回答

吃鸡游戏

fgets读取直到它看到换行符然后返回,所以当你键入bob时,在控制台中,targetName包含“bob \ n”,它与“bob”不匹配。从fgets文件:(加粗)从流中读取字符并将它们作为C字符串存储到str中,直到读取(num-1)个字符或者到达换行符或文件结尾,以先到者为准。 换行符使fgets停止读取,但它被认为是有效字符,因此它包含在复制到str的字符串中。 在读取字符后,空字符会自动附加在str中,以表示C字符串的结尾。在比较之前,您需要从targetName的末尾删除换行符。int cch = strlen(targetName);if (cch > 1 && targetName[cch-1] == '\n')    targetName[cch-1] = '\0';或者将新行添加到测试字符串中。char targetName[50];fgets(targetName,50,stdin);char aName[] = "bob\n";printf("%d",strcmp(aName,targetName));

POPMUISE

\n当用户按Enter键时,fgets会向用户提供的字符串附加一个。你可以通过使用strcspn或只是添加\n到你想要比较的字符串的末尾来解决这个问题。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)这只是取代了\na \0,但如果你想要懒惰,你可以这样做: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)但它并不那么优雅。
打开App,查看更多内容
随时随地看视频慕课网APP