【问题标题】:String reading issue using scanf使用 scanf 的字符串读取问题
【发布时间】:2011-04-13 12:28:46
【问题描述】:

现在我读到了一些:

scanf() 转换 %[\n] 将 匹配换行符,而 %[^\n] 将匹配所有字符 换行符。

但是在下面的代码中:

#include<stdio.h>


int main() {
printf("Enter Something: ");
char name[100];   
scanf("%99[help]", name);
printf("%s",name);
}

当我输入help me 时我没有遇到任何问题,因为打印的单词是help。但是,当我输入 I need help 时,它会打印垃圾。请帮助如何解决这个问题? 我的目标是匹配输入中任意位置输入的单词help,例如,

"This is a test, i need help in this"

应该检测到help

【问题讨论】:

  • 你可以写%[\n]并不意味着你可以写%[help]。您正在得出结论并做出假设:编程不好! (我什至不相信它对 \n 有效。)您实际上想在这里实现什么?
  • 我说的是模式匹配。
  • @NabinSur:你实际上想在这里实现什么?

标签: c input scanf


【解决方案1】:

您需要检查scanf 的结果。如果匹配失败,你传入的指针不会被修改。在您的具体情况下,name 将包含任意数据。

检查scanf 的输出后,您会发现它与该字符串不匹配。 scanf 不是正则表达式解析器。它只会尝试匹配它在输入流中看到的第一个“项目”。

匹配说明符%99[help] 的意思是“我想匹配任何包含字母 h、e、l、p 以任何顺序,最长 99 个字符的东西”。就这样。所以它在你输入的第一个字母(“T”)上失败了,它不在集合中。

如果你想在另一个字符串中查找一个字符串,例如使用strstr。要读一整行,如果你的环境有的话,最简单的就是使用getline

【讨论】:

    【解决方案2】:

    您需要扫描集来识别您可能输入的所有字符。还需要查看scanf()的返回是否成功。

    #include <stdio.h>
    
    int main()
    {
        printf("Enter Something: ");
        char name[100];   
        if (scanf("%99[Indhelp ]", name) != 1)
            fprintf(stderr, "scanf() failed\n");
        else
            printf("%s",name);
        return 0;
    }
    

    这将识别“我需要帮助”和许多其他短语。 C标准说:

    如果 - 字符在扫描列表中并且不是第一个,也不是 第二个,其中第一个字符是 ^,也不是最后一个字符,行为是 实现定义。

    在许多实现中,您可以使用诸如%[a-zA-Z ] 之类的符号来获取一串字母或空格。但是,这是实现定义的行为。这意味着它可以做任何实现选择的事情,但实现必须记录它的含义。

    编写扫描集的可靠方法是:

    %[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ]
    

    当然,这会让您在标点符号方面遇到一些问题,更不用说重音字符了;如果您愿意,可以将两者都添加到扫描集中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-11
      • 1970-01-01
      • 2013-07-04
      • 1970-01-01
      • 1970-01-01
      • 2012-08-31
      相关资源
      最近更新 更多