现在我读了一些东西:
scanf()转换%[n]将匹配换行符,while%[^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
需要检查scanf
的结果。如果匹配失败,则不修改传入的指针。在您的特定情况下,name
将包含任意数据。
检查scanf
的输出后,您将看到它无法匹配该字符串。scanf
不是正则表达式解析器。它只会尝试匹配它在输入流中看到的第一个"item"。
匹配说明符%99[help]
表示"我要匹配任何包含字母h, e, l, p 的任意顺序,长度不超过99个字符"。这是所有。因此,它在输入的第一个字母("T")上失败,该字母不在集合中。
如果你想在另一个字符串中查找一个字符串,使用strstr
为例。要读取整行,如果您的环境有的话,最简单的是使用getline
。
需要扫描集来识别可能输入的所有字符。您还需要检查scanf()
的返回,看看它是否成功。
#include <stdio.h>
int main()
{
printf("Enter Something: ");
char name[100];
if (scanf("%99[Indhelp ]", name) != 1)
fprintf(stderr, "scanf() failedn");
else
printf("%s",name);
return 0;
}
它将识别"我需要帮助"和许多其他短语。C标准说:
如果-字符在扫描列表中并且不是第一个字符,也不是第二,如果第一个字符是^,而不是最后一个字符,则行为是实现定义。
在许多实现中,您可以使用诸如%[a-zA-Z ]
之类的符号来拾取一串字母或空格。然而,这是实现定义的行为。这意味着它可以做任何实现选择的事情,但实现必须记录它的含义。
编写扫描集的可靠方法是:
%[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ]
当然,这给你留下了一些关于标点的问题,更不用说重音字符了;如果您愿意,可以将两者都添加到扫描集。