到目前为止,我怎么能算出字符串中有多少辅音呢?

时间:2011-06-06 02:26:56

标签: c++ string

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;
}

8 个答案:

答案 0 :(得分:8)

你很接近,但是应该用逻辑 - 或||检查,而不是逻辑 - 而&&str[i]根本不能等于两个不同的事情。)

C ++ 03 Standard允许您使用关键字andor - 和notxor等 - 而不是这些神秘的(对于新程序员)符号,但这并未引起广泛关注 - 可能是因为Microsoft的编译器在这方面并不默认为符合标准 - 可能是为了避免破坏具有这些名称的变量,函数,类型等的现有客户端代码。因此,为了便于携带和简化,许多图书馆和教科书也避免使用这些关键字。

另一种可能更简洁的方法是使用isalpha()中的<cctype>然后检查它不是元音。更快的方法倾向于使用从字符值到bool的数组,但是要注意由于有符号字符值或> = 128位非ASCII值而在数组外部进行索引。如果还要考虑大写/小写 - 您可能希望在测试之前对您的角色使用tolower()(例如char c = tolower(str[i])); if (c == '...)。

其他说明:您的功能应该:

  • 通过std::string引用(即const)接受其const std::string& str参数,以避免将不必要且耗时的值从调用上下文复制到此函数的本地单独变量中。复制不会造成任何实际的功能伤害,但这是不必要的。
  • 使consonant成为一个局部变量而不是一个函数参数,因为任何输入的值都会立即被0填充,结果它由函数返回而不是写入consonant(这是不可能的)因为它是通过值传递而不是通过指针/引用传递的。)

答案 1 :(得分:3)

这个怎么样:

#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;
}

答案 2 :(得分:2)

首先:&&将测试所有内容,直到某些内容返回false或结束。你想要的是||,它会在条件为true之前进行测试 第二:什么是短的?测试辅音或测试元音?元音当然。只需将该测试放在一个额外的函数中(注意:我假设这里有一个有效的字母输入字符串):

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

之后,只需用简单的!is_vowel(str[i])替换你的大条件语句。 :)最后但并非最不重要的是,你想增加你的consonant变量,并且有一个特殊的运算符:增量运算符! (很酷的名字,嗯?)

++consonant; // better than consonant = consonant + 1; but same result

答案 3 :(得分:0)

查看正则表达式。它允许您指定要检查的字符列表。您可以根据列表检查字符串中的每个字符并增加计数器。

http://www.johndcook.com/cpp_regex.html

答案 4 :(得分:0)

对于初学者,您正在使用&&(和),在这种情况下这是一个逻辑错误。您想使用||(或)。

您还可以通过检查代码是否不是元音来缩短代码。

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;
}

其他人已经发布了此代码的替代形式作为函数,您只需传入要测试的变量。

答案 5 :(得分:0)

#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;
}

或者,如果您不希望非alpha内容匹配,您可以这样做:

#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;
}

答案 6 :(得分:0)

这项功课有点过分,但仅供参考 - 面向对象的方法:

struct Consonants
{
    bool x_[256];

    Consonants()
    {
        // constructor sets x_[i] to true or false to indicate
        // whether character with ASCII number i is a consonant...

        for (int i = 0; i < 256; ++i)
            x_ = false;

        // note: ASCIIZ string finishes with NUL, so *p becomes false
        //       and for loop exits
        for (const char* p = "bcdfghjklmnpqrstvwxyz"
                             "BCDFGHJKLMNPQRSTVWXYZ"; *p; ++p)
            x_[*p] = true;
    };

    int in(const std::string& str) const
    {
        int result = 0;
        for (int i = 0; i < str.size(); ++i)
            if (x_[(unsigned char)str[i]])
                ++result;
        return result;
    }
};

用法:

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");

答案 7 :(得分:0)

您可以使用以下内容来计算字符串中有多少个辅音:

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;
}