C++ 到目前为止,我如何计算一个字符串中有多少个辅音

C++ 到目前为止,我如何计算一个字符串中有多少个辅音,c++,string,C++,String,研究正则表达式。它允许您指定要检查的字符列表。您将对照列表检查字符串中的每个字符,并递增计数器 您很接近,但应该检查逻辑or,而不是逻辑and&&str[i]不能等于两个不同的东西 C++03标准允许您使用关键字和或-而不是xor等,而不是这些对新程序员来说神秘的符号,但这并没有广泛流行-可能是因为微软的编译器在这方面并不默认为标准兼容-大概是为了避免破坏现有的具有变量的客户端代码,具有这些名称的函数、类型等。因此,为了便于携带和简化,许多图书馆和教科书也避免使用这些关键字 另一种可能更简洁的方

研究正则表达式。它允许您指定要检查的字符列表。您将对照列表检查字符串中的每个字符,并递增计数器


您很接近,但应该检查逻辑or,而不是逻辑and&&str[i]不能等于两个不同的东西

C++03标准允许您使用关键字和或-而不是xor等,而不是这些对新程序员来说神秘的符号,但这并没有广泛流行-可能是因为微软的编译器在这方面并不默认为标准兼容-大概是为了避免破坏现有的具有变量的客户端代码,具有这些名称的函数、类型等。因此,为了便于携带和简化,许多图书馆和教科书也避免使用这些关键字

另一种可能更简洁的方法是使用isalpha,然后检查它不是元音。更快的方法倾向于使用从字符值到bool的数组,但要注意由于有符号字符值或>=128位非ASCII值而在数组外建立索引。如果还有大写/小写要考虑的话,在测试之前,你可能想在你的角色上使用ToWar,即char c= TooWrrSTR[i];如果c=='

其他注意事项:您的功能应:

通过const引用接受其std::string参数,即const std::string&str,以避免不必要且耗时地将值从调用上下文复制到该函数的单独局部变量中。复制不会造成任何真正的功能损害,但它是不必要的。 使consonant成为一个局部变量而不是函数参数,因为任何输入值都会立即被0替换,结果由函数返回而不是写入consonant,这是不可能的,因为它是通过值传递的,而不是通过指针/引用传递的。 首先:&&将测试所有内容,直到返回false或结束。你想要的是| |,它会一直测试到条件为真。 第二:什么比较短?测试辅音还是测试元音?当然是元音。只需将该测试放在一个额外的函数中注意:我假设这里有一个有效的按字母顺序排列的输入字符串:

int countConsonant(string str, int consonant)
{
    int length = str.length();
     consonant = 0;

        for (int i = 0; i < length; i++)
        {
            if(str[i] == 'b'&& str[i] == 'c' && str[i] == 'd'&& str[i] == 'f'
                && str[i] == 'g'&& str[i] == 'h'&& str[i] == 'j' && str[i] == 'k'&& str[i] == 'l'&& str[i] == 'm'
                && str[i] == 'n'&& str[i] == 'p'&& str[i] == 'q'&& str[i] == 'r'&& str[i] == 's'&& str[i] == 't'
                && str[i] == 'v'&& str[i] == 'w'&& str[i] == 'x'&& str[i] == 'y'&& str[i] == 'z')

                consonant = consonant + 1;
        }
        return consonant;
}
然后,用一个简单的语句替换你的大条件语句!is_vouelstr[i]:最后但并非最不重要的一点是,你想增加辅音变量,这有一个特殊的操作符:增量操作符!很酷的名字,嗯

function is_vowel(c) : bool
  for each vowel test
    if c == that vowel
      return true
  return false

对于初学者,您使用的是&&和,在本例中这是一个逻辑错误。您想使用| |或

通过检查它们是否不是元音,您还可以大大缩短代码

++consonant; // better than consonant = consonant + 1; but same result
其他人已经发布了此代码的另一种形式作为函数,您只需传入要测试的变量

int countConsonant(string str, int consonant)
{
    int length = str.length();
    int consonant = 0;

    for (int i = 0; i < length; i++)
    {
        if(!(str[i] == 'a' || str[i] == 'e' || str[i] == 'i' || str[i] == 'o' ||
            str[i] == 'u'))

        consonant = consonant + 1;
    }
    return consonant;
}
或者,如果您不希望非alpha内容匹配,您可以这样做:

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

size_t countConsonant(const string& s) {
    const string vowels("aeiou");
    size_t count = 0;
    for (string::const_iterator i = s.begin(); i != s.end(); ++i) {
        if (vowels.find(tolower(*i)) == string::npos) {
            ++count;
        }
    }
    return count;
}

int main() {
    cout << countConsonant("abcd") << endl;
}
这个怎么样:

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

size_t countConsonant(const string& s) {
    const string cons("bcdfghjklmnpqrstvwxyz");
    size_t count = 0;
    for (string::const_iterator i = s.begin(); i != s.end(); ++i) {
        if (cons.find(tolower(*i)) != string::npos) {
            ++count;
        }
    }
    return count;
}

int main() {
    cout << countConsonant("abcd") << endl;
}

这篇作业写得太多了,但仅供参考-一种面向对象的方法:

#include <algorithm>
#include <iostream>
#include <string>


bool isVowel(char c)
{
    switch (c)
    {
        case 'a':
        case 'e':
        case 'i':
        case 'o':
        case 'u':
        {
            return true;
        }
        default:
        {
            return false;
        }
    }
}


bool isConsonant(char c)
{
    return !isVowel(c);
}


int main(int argc, char *argv[])
{
    std::string test = "hello";
    std::size_t numVowels = std::count_if(test.begin(), test.end(), isConsonant);
    std::cout << "Number of vowels is: " << numVowels << std::endl;
    return 0;
}

您可以使用以下方法计算字符串中的辅音数:

Consonants consonants;  // create an "utility" object once

int c1 = consonants.in("hello world");   // use as often as desired
int c2 = consonants.in("goodbye cruel world");

我认为OP的家庭作业中不允许使用正则表达式。我认为不应该用正则表达式来攻击一切。。。吻。@xeo-哈哈。在我看来,正则表达式更容易@paul regex对于你的hw任务来说太过分了,但是他们非常棒。如果你想扩展你的编程知识,请阅读它们!哈哈,你的代码基本上是说如果str[i]同时是字母表中所有的辅音。那是一个超级角色!对于元音部分,字符不能是元音,也不能是辅音@赫尔曼先生:嗯,是的,如果不是信的话。。我假设OP得到一个有效的输入字符串,你是对的。isConsonant应该返回!Is元音和isalphac;我喜欢最基本的。但是字符“=”现在是contant。但是,您可以使用255的数组来代替开关,表示辅音为真/假。@马丁:注意,使用带符号字符可能会导致查找负数组索引,因此需要先将其转换为无符号或范围检查。无论如何,switch还是很不错的-编译器应该能生成相当好的代码,尽管空间/速度的权衡可能不是你想要的。@Tony:我相信isalpha和其他字符特征类型函数等的作者在编写代码时考虑到了这一切。然而,它仍然是一个表中的查找,因此我的建议只遵循一些非常可靠和经过高度测试的代码的治疗。“是的,切换是快速有效的,但我打赌索引查找可能有一点优势,特别是因为它不涉及难以预测的跳转。@马丁:是的,我不是在争论我在回答中列出的索引方法,只是说如果自己实现它,这就是这个问题的主旨,而不是使用预IsAlg等,那么你需要考虑这个容易被忽视的方面。索引确实会更快,甚至有很好的机会
mpiler将从交换机生成索引查找,但它可能会首先对其进行范围检查,因此查找表要小得多—既节省空间又浪费时间。对于这种类型的函数,运行时通常是压倒性的优先级,因此显式表很好。但不完全一样。字符“=”现在是一个常量。@Martin你说得对,我对字符串中的字符做了不应该做的假设。第二个实现更好。或者您可以将count模板化以接受const char*,并根据需要实例化辅音、元音或其他任何内容……欢迎使用SO!在回答中发布代码时,解释代码如何解决OP的问题很有帮助。请编辑您的答案以包括以下内容:
Consonants consonants;  // create an "utility" object once

int c1 = consonants.in("hello world");   // use as often as desired
int c2 = consonants.in("goodbye cruel world");
int main()
{
    char a[20];
    int consonants; 
    gets(a);
    cout<<a<<endl;
    if(a[i]>=0 && a[i]<=9)  //  consonants
    {
        consonants++;
    }
    cout<<"Total Consonats are: "<<consonants;
}