0

在调用中使用占位符是否违法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()andsscanf()代替scanf(),但现在我很想知道我是否可以扩展它。

4

3 回答 3

2

你不能fgets像这样比较字符串。它的语法不是非法的,但它并没有像你预期的那样工作。首先,==用于比较字符串只会比较指针。其次,%s在简单字符串中没有特殊含义。这是你应该做的:

fgets. 用于sscanf获取名称。检查返回值sscanf是否匹配成功。如果成功,返回值应该是2,表示匹配了 2 个项目。

于 2013-10-15T00:55:30.807 回答
2

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

这个:

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

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

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

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

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

于 2013-10-15T00:55:38.620 回答
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;
}
于 2013-10-15T00:57:20.087 回答