我想比较两个字符串。 一个存储在文件中,其它从用户(标准输入)检索。
这里有一个简单的程序:
int main()
{
char targetName[50];
fgets(targetName,50,stdin);
char aName[] = "bob";
printf("%d",strcmp(aName,targetName));
return 0;
}
在这个程序中, strcmp
返回-1当输入为一个值"bob"
。 为什么是这样? 我想他们应该是平等的。 我怎样才能得到它,以便他们是谁?
strcmp
是有真假反向结果的几个功能之一......如果两个字符串相等,结果为0,而不是1,你会觉得....
if (strcmp(a, b)) {
/* Do something here as the strings are not equal */
} else {
/* Strings are equal */
}
说到fgets
,有一种可能性,那就是连接到字符串的结尾换行......你需要摆脱它......
+-+-+-+--+--+
|b|o|b|\n|\0|
+-+-+-+--+--+
为了摆脱换行的做到这一点。 注意事项:不要使用“的strlen(aName) - 1”,因为通过与fgets返回的线可与NUL字符开始 - 从而索引到缓冲变为-1:
aName[strcspn(aName, "\n")] = '\0';
+-+-+-+--+
|b|o|b|\0|
+-+-+-+--+
现在, strcmp
应该返回0 ...
fgets
读取,直到它看到一个换行符然后返回,所以当你键入Bob,在控制台中, targetName
中包含“鲍勃\ n”,这不符合“鲍勃”。 从与fgets documenation:(加粗加)
从流读取字符并把它们存储为C字符串到STR直到已经读取或达到任一换行或所述档案结尾(NUM-1)的字符,以先到者为准。 一个换行符使得与fgets停止阅读,但它被认为是一种有效的字符,因此它是包含复制到str中的字符串中。 字符读取到信号的C字符串结束后一个空字符自动str中追加。
您需要在比较之前从目标名称的末尾删除换行。
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));
因为与fgets被embededing换行符入变量targetName
。 这是摆脱了比较。
在与fgets被追加一个\n
为您从用户拉动时,击中输入的字符串。 您可以通过使用解决这个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)
但它不是优雅。
fgets
追加换行符的字符串,所以你结了bob\n\0
这是不一样的bob\0
。
主要是因为在输入线炭的端“\ n”个UNIX下的像系统。