为了账号安全,请及时绑定邮箱和手机立即绑定

用fgets读取的行上的strcmp

用fgets读取的行上的strcmp

C
慕工程0101907 2019-07-25 14:50:35
用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"。为什么是这样?我认为他们应该是平等的。我怎样才能得到它们呢?
查看完整描述

3 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

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));



查看完整回答
反对 回复 2019-07-25
?
POPMUISE

TA贡献1765条经验 获得超5个赞

\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)

这只是取代了\n\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)

但它并不那么优雅。


查看完整回答
反对 回复 2019-07-25
  • 3 回答
  • 0 关注
  • 715 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信