用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));
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
a \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)
但它并不那么优雅。
- 3 回答
- 0 关注
- 715 浏览
添加回答
举报
0/150
提交
取消