【问题标题】:Can placeholders be used with fgets?占位符可以与 fgets 一起使用吗?
【发布时间】:2013-10-15 00:46:29
【问题描述】:

在对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(),但现在我有点想知道是否可以扩展它。

【问题讨论】:

  • 如果str1str2 被声明为char*,我认为你对str1 == str2 的作用感到困惑。
  • 你的问题实际上是关于为什么这个程序总是显示What?,不管你输入什么?
  • 你根本不能使用%s 和其他占位符与fgets
  • 记得用换行符终止输出行;在您输出换行符之前,通常不会出现打印。

标签: c string fgets


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    这个:

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

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

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

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

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

    【讨论】:

      【解决方案3】:
      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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-11
        • 2011-11-01
        • 2015-10-03
        • 1970-01-01
        • 2010-09-16
        • 1970-01-01
        相关资源
        最近更新 更多