繁体   English   中英

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

[英]Can placeholders be used with 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() ,但是现在我很想知道是否可以对此进行扩展。

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

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

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

这个:

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

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

您可以使用strcmp()函数比较字符串是否相等,但这并不能满足您所需要的模式匹配。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM