在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()
的做法,但现在我有点好奇,看看我是否可以扩展它。
答案 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;
}