我想过滤输入。我不知道最好的方法是什么。我想要读取以alpha-bates开头的单词。例如,如果输入为:
This is 1 EXAMPLE1 input.
字符串应该是这样的:
This is EXAMPLE1 input
过滤此类输入的最简单方法是什么?
我尝试使用"%[a-zA-Z]s"
,但它不起作用。
答案 0 :(得分:2)
您的扫描字符串"%[a-zA-Z]s"
可能不是您想的那样。删除尾随s
。
"%[a-zA-Z]"
将扫描一个完全由小写和大写字母组成的字符串。所以数字会打折扣。但是,您希望扫描以小写或大写字母开头的字母数字字符串。 scanf
不提供以这种方式查找字符串的工具。相反,您可以使用"%[a-zA-Z0-9]"
扫描字母数字字符串,然后删除扫描输入(如果字符串的第一个字符是数字)。
出于各种原因,使用scanf
很棘手。字符串可能比您预期的长,并导致缓冲区溢出。如果输入的格式不符合您的预期,则scanf
可能无法超出意外输入。无条件地将输入读入缓冲区并解析缓冲区通常更可靠。例如:
const char *wants
= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
std::string word;
while (std::cin >> word) {
if (!isalpha(word[0])) continue;
std::string::size_type p = word.find_first_not_of(wants);
word = word.substr(0, p);
//... do something with word
}