所以,我试图从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
答案 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]);
}