如何忽略std :: cin中的非字母

时间:2014-10-14 22:34:41

标签: c++ c++11

所以,我试图从cin中读取一个字符串,然后遍历字符串以计算该字符串中的哪些字符实际上是英文字母中的字母。我已经编写了一个工作正常的程序,但我想知道是否有更有效的方法来完成这项工作,而不会遍历整个英文字母。

#include <iostream>
#include <string>
using namespace std;

int main() {

    string my_str; //will use to store user input
    getline(cin, my_str); //read in user input to my_str

     int countOfLetters = 0; //begine count at 0
     string alphabet = "abcdefghijklmnopqrstuwxyz"; //the entire english alphabet

     for(int i = 0; i < my_str.length(); i++){
        for(int j = 0; j < alphabet.length(); j++){
            if (tolower(my_str.at(i)) == alphabet.at(j)){ //tolower() function used to convert all characters from user inputted string to lower case
                    countOfLetters += 1;
            }
        }
     }

     cout << countOfLetters;
    return 0;
}

编辑:这是我新的和改进的代码:

#include <iostream>
#include <string>
using namespace std;

int main() {

    string my_str; //will use to store user input
    getline(cin, my_str); //read in user input to my_str

     int countOfLetters = 0; //begine count at 0
     string alphabet = "abcdefghijklmnopqrstuwxyz"; //the entire english alphabet

     for(unsigned int i = 0; i < my_str.length(); i++){
            if (isalpha(my_str.at(i))){ //tolower() function used to convert all characters from user inputted string to lower case
                    countOfLetters += 1;
            }
        }


     cout << countOfLetters;
    return 0;
}
    enter code here

5 个答案:

答案 0 :(得分:2)

使用isalpha()查看哪些字母是字母并将其排除。

所以,您可以像这样修改代码:

#include <iostream>
#include <string>
using namespace std;

int main() {

  string my_str;
  getline(cin, my_str);

  int countOfLetters = 0;

  for (size_t i = 0; i < my_str.length(); i++) { // int i produced a warning
    if (isalpha(my_str.at(i))) {  // if current character is letter
      ++countOfLetters;           // increase counter by one
    }
  }

  cout << countOfLetters;
  return 0;
}

答案 1 :(得分:1)

您可以使用isalpha

for(int i = 0; i < my_str.length(); i++)
    if (isalpha(my_str.at(i))
        countOfLetters++;

答案 2 :(得分:1)

您可以使用std::count_if()算法和迭代器接口来计算某些谓词返回true的字符。谓词可以使用std::isalpha()来检查字母字符。例如:

auto count = std::count_if(std::begin(str), std::end(str),
                           [&] (unsigned char c) { return std::isalpha(c); });

答案 3 :(得分:0)

您还可以检查int cast是否介于65-90或97-122

之间

示例

(int)'a'

应该给97

毫无疑问,这将是最高性能的方法。 它比使用isalpha()更好。

检查http://www.asciitable.com/是否有ASCI号码

答案 4 :(得分:0)

isalpha适用于这个特殊问题,但如果要接受的字符列表不那么简单,那么有一个更通用的解决方案。例如,如果您想添加一些标点符号。

std::set<char> good_chars;
good_chars.insert('a'); good_chars.insert('A');
good_chars.insert('b'); good_chars.insert('B');
// ...
good_chars.insert('z'); good_chars.insert('Z');
good_chars.insert('_');
// the above could be simplified by looping through a string of course

for(int i = 0; i < my_str.length(); i++){
    countOfLetters += good_chars.count(my_str[i]);
}