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