如何确定一个字符是否是一个元音

时间:2014-12-15 09:02:46

标签: c++

我正在尝试使用vector[].substr(),但我不知道这是否可行。有谁知道另一种方法吗?我的目标是采用向量中的单词并将其与第一个元音分开。任何帮助表示赞赏。我的代码看起来像:

#include <iostream>
#include "derrick_math.h"
#include <string>
#include <sstream>
#include <vector>
#include <cctype>
#include <algorithm>
using namespace std;

int main()
{
    string phrase;
    string ay = "ay";
    vector<string> vec;
    cout << "Please enter the word or phrase to translate: ";
    getline(cin, phrase);

    istringstream iss(phrase);
    copy(istream_iterator<string>(iss), 
         istream_iterator<string>(), 
         back_inserter(vec));
    for (int i = 0; i < vec.size(); i++)
    {
        if (vec[i].substr(0, 1) == "a || e || i || o || u || A || E || I || O || U")
    {
        cout << vec[i] << "ay";
    }
    if (vec[i].substr(1, 1) == "a || e || i || o || u || A || E || I || O || U")
    {
        cout << vec[i].substr(2) << vec[i].substr(0, 1) << "ay";
    }
    if (vec[i].substr(2, 1) == "a || e || i || o || u || A || E || I || O || U")
    {
        cout << vec[i].substr(3), vec[i].substr(0, 2) + "ay";
    }
    if (vec[i].substr(3, 1) == "a || e || i || o || u || A || E || I || O || U")
    {
        cout << vec[i].substr(4), vec[i].substr(0, 3) + ay;
    }
    cout << vec[i] << " ";
    }
    cout << endl;
    system("pause");
    return 0;

2 个答案:

答案 0 :(得分:4)

访问矢量元素的成员函数不是问题。您的if语句格式不正确。目前,您正在将子字符串与一个长字符串进行比较,在这种情况下,它永远不会评估为真。

如果你想检查一个特定的角色,你需要这样的东西:

bool is_vowel(char c) {
    c = tolower(c);
    return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u';
}

或者...

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

现在您可以这样调用您的函数:

std::string s = vec[i];
if(is_vowel(s[n])) {
    // the third character is a vowel
}

您的代码也存在其他一些问题。这一行:

cout << vec[i].substr(4), vec[i].substr(0, 3) + ay;

应该是:

// no comma operator
cout << vec[i].substr(4) << vec[i].substr(0, 3) + ay;

要在向量的末尾添加项目,您只需要:

vec.push_back(s);

答案 1 :(得分:0)

您可以使用std::string::find_first_of

这将找到参数中所有任何角色的第一场比赛的位置。 然后将它与substr分开,如

for (int i = 0; i < vec.size(); ++i){
    size_t pos = vec[i].find_first_of("aAeEiIoOuU");
    std::string result = "";

    if (pos != std::string::npos){ // Check if find_first_of got a match
        result = vec[i].substr(pos + 1);
    }
    std::cout << "result = " << result << std::endl;
}

编辑如果您正试图获得声音,则可以使用此功能:

for (int i = 0; i < vec.size(); ++i){
    size_t pos = vec[i].find_first_of("aAeEiIoOuU");
    char result;

    if (pos != std::string::npos){
        result = vec[i][pos];
    }
    std::cout << "result = " << result << std::endl;
}