[英]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.