占位符可以与fgets一起使用吗?

时间:2013-10-15 00:46:29

标签: c string fgets

fgets的调用中使用占位符是不合法的吗?

例如,我编写了以下代码:

#include <stdio.h>

int main(void)
{
    char input[32], name_first[16], name_last[16];

    if (fgets(input, 32, stdin) == "My name is %s %s")
    {
        sscanf(input, "My name is %s %s", &name_first, &name_last);
        printf("Your name is %s %s", name_first, name_last);
    }
    else
        printf("What?");

    getchar();
    return 0;
}

我认为看到我正在尝试使用该程序非常简单。如果您输入“我的名字是”的句子,程序将显示“您的名字是”,然后是您之后键入的前一个或两个单词。

我将此作为使用fgets()sscanf()代替scanf()的做法,但现在我有点好奇,看看我是否可以扩展它。

3 个答案:

答案 0 :(得分:2)

您无法将字符串与fgets进行比较。它的语法并不违法,但它并不像你期望的那样工作。首先,使用==比较字符串只会比较指针。其次,%s在简单的字符串中没有特殊含义。这是你应该做的:

获取fgets行。使用sscanf获取名称。检查sscanf的返回值以查看匹配是否成功。如果成功,则返回值应为2,表示匹配了2个项目数。

答案 1 :(得分:2)

您不能使用==来比较字符串,当然也不能对它们进行模式匹配。

此:

if (fgets(input, 32, stdin) == "My name is %s %s")

测试fgets()返回的指针是否指向与字符串文字"My name is %s %s"相同的地址。当然不会。

您可以使用strcmp()函数来比较字符串是否相等,但这并不是您正在寻找的那种模式匹配。

只需调用fgets()来存储一行(并检查返回值以查看是否存在错误)。

您已使用sscanf。你只需要检查它是否成功。它返回它能够读取的项目数。在这种情况下,返回值2表示成功。

答案 2 :(得分:1)

int main(void)
{
    char input[32], name_first[16], name_last[16];

    if (NULL != fgets(input, 32, stdin) &&
        2 == sscanf(input, "My name is %s %s", &name_first, &name_last) )
    {
        printf("Your name is %s %s", name_first, name_last);
    }
    else
        printf("What?");

    getchar();
    return 0;
}