strcmp的上用于fgets读取一行strcmp的上用于fgets读取一行(strcmp on a

2019-05-09 06:03发布

我想比较两个字符串。 一个存储在文件中,其它从用户(标准输入)检索。

这里有一个简单的程序:

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

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

    return 0;
}

在这个程序中, strcmp返回-1当输入为一个值"bob" 。 为什么是这样? 我想他们应该是平等的。 我怎样才能得到它,以便他们是谁?

Answer 1:

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 ...



Answer 2:

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


Answer 3:

因为与fgets被embededing换行符入变量targetName 。 这是摆脱了比较。



Answer 4:

在与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)

但它不是优雅。



Answer 5:

fgets追加换行符的字符串,所以你结了bob\n\0这是不一样的bob\0



Answer 6:

主要是因为在输入线炭的端“\ n”个UNIX下的像系统。



文章来源: strcmp on a line read with fgets