这应该只接受字母,但它还不正确:
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main()
{
std::string line;
double d;
while (std::getline(std::cin, line))
{
std::stringstream ss(line);
if (ss >> d == false && line != "") //false because can convert to double
{
std::cout << "its characters!" << std::endl;
break;
}
std::cout << "Error!" << std::endl;
}
return 0;
}
这是输出:
567
Error!
Error!
678fgh
Error!
567fgh678
Error!
fhg687
its characters!
Press any key to continue . . .
由于字符串中的数字, fhg687
应该输出错误。
接受的输出应仅包含字母,例如ghggjh
。
答案 0 :(得分:12)
使用适当的谓词在字符串上使用std::all_of
会好得多。在您的情况下,该谓词将为std::isalpha
。 (标题<algorithm>
和<cctype>
必需)
if (std::all_of(begin(line), end(line), std::isalpha))
{
std::cout << "its characters!" << std::endl;
break;
}
std::cout << "Error!" << std::endl;
答案 1 :(得分:7)
已更新:以显示更全面的解决方案。
最简单的方法可能是迭代输入中的每个字符并检查该字符是否在English-letter ranges in ascii内(上限+下限):
char c;
while (std::getline(std::cin, line))
{
// Iterate through the string one letter at a time.
for (int i = 0; i < line.length(); i++) {
c = line.at(i); // Get a char from string
// if it's NOT within these bounds, then it's not a character
if (! ( ( c >= 'a' && c <= 'z' ) || ( c >= 'A' && c <= 'Z' ) ) ) {
std::cout << "Error!" << std::endl;
// you can probably just return here as soon as you
// find a non-letter char, but it's up to you to
// decide how you want to handle it exactly
return 1;
}
}
}
答案 2 :(得分:2)
您还可以使用正则表达式,如果您需要更多灵活性,这可能会派上用场。
对于这个问题,本杰明的答案是完美的,但作为参考,这就是如何使用正则表达式(注意regex
也是C ++ 11标准的一部分):
boost::regex r("[a-zA-Z]+"); // At least one character in a-z or A-Z ranges
bool match = boost::regex_match(string, r);
if (match)
std::cout << "it's characters!" << std::endl;
else
std::cout << "Error!" << std::endl;
如果string
仅包含字母字符且至少包含其中一个字符(+
),则match
为true
。
要求:
<boost/regex.hpp>
和-lboost_regex
。<regex>
。