C++比较字符和字符串

3

我试图循环遍历一个单词,但是仅有元音字母有效。另一种类型会打印出总单词数。请原谅我的瑞典语和英语混杂的用词不够准确。

#include <iostream>

using namespace std;

int main()
{
    int vo = 0;
    int ko = 0;

    char vocals[7]
    {
        'A','O','U','E','I','Y'
    };


    char konsonanter[19]
    {
        'B','C','D','F','G','H','J','K','L','M','N','P','Q','R','S','T','V','X','Z'
    };

    string word = "Toysoldier";

    for(int i = 0; i < word.length(); i++)
    {
        for(int v = 0; v < vocals[v]; v++)
        {
            if(vocals[v] == word[i])
                vo++;
        }

        for(int k = 0; k < konsonanter[k]; k++)
        {
            if(konsonanter[k] == word[i])
                ko++;
        }
    }


    cout << "Konsonanter = " << ko << " Vokaler = " << vo << endl;
}

5
请检查您的循环条件:k < konsonanter[k]。该条件的含义是当索引变量“k”小于列表“konsonanter[k]”中的元素值时,循环会继续执行。 - 463035818_is_not_a_number
说实话,同样地,vocals[v] 的条件也一样... - Roger Lipscombe
另外,char vocals[7] 有6个元素,最后一个未定义。 - freakish
2
如果你现在正在学习C++,可以从更少出错的循环样式开始,例如for (auto c : word)for (auto v : vocals)等。 - Useless
1
@freakish 最后一个被定义为0。 - M.M
停止条件不应该是v!= '\0'吗? - fiorentinoing
4个回答

3
你的循环条件有误。 你可能想要写成v < 7,因为你的数组中有7个元音。 而不是v < vocals[v]v被初始化为零,而表达式vocals[v]是一个char,也可以用于数组下标('A'被转换为65,'E'被转换为69等), 所以写成v < vocals[v]也不是错误。
在辅音的循环中也存在同样的问题。

1
您有多个错误,因此我将按顺序对所有代码进行备注。
如果您编写
char vocals[7] = {'A' ... 'Y'};

我希望你能手动保持数组大小和初始化程序的同步 - 例如,在这里,你错过了一个(你在一个有7个元素的数组中有6个“人声”)。

写起来容易出错,更好的做法是:

char vowels[] = {'A', 'E', 'I', 'O', 'U'};

我把它重命名为“vowels”,因为这是英语中它们的名称,并删除了“Y”,因为它不是元音字母 - 显然,您可以坚持使用在瑞典语中适用的任何内容。

同样,这个循环是错误的:

for(int v = 0; v < vocals[v]; v++)

因为你正在比较 v(一个指向你的数组的索引)和 vocals[v],它是一个字符值。它们是两种不同类型的东西,这里进行比较没有意义。对数组的循环通常会写成这样:
for (int v = 0; v < sizeof(vocals)/sizeof(vocals[0]); ++v)

对于一个包含N个元素的数组,索引v范围是从0到N-1。更简单的方式是直接写成:
for (auto v : vocals)

其中v现在是一个字符,在循环体中逐个获取每个元音字母的值。编译器可以为您计算数组大小。

说实话,我会以这种方式重写所有循环:除非您正在做更复杂的事情,否则不需要手动管理数组索引和边界。

除了循环条件错误外,您的字符比较通常也会失败:元音和辅音数组都只包含大写字母,而您的字符串大多是小写字母。您需要处理这个问题,例如使用

#include <cctype>

// ...
for (auto c : word) {
  for (auto v : vowels) {
    if (v == std::toupper(c)) {

0

你的错误出现在“for”循环中使用的测试中: v < vocals[v]会将整数v与字符vocals[v]的整数值进行比较,而该字符的整数值恰好是该字符的ASCII代码(实际上,在65到90之间,可以在网上查找“Ascii表”)。

要修复你的代码,你应该像这样修改你的“for”循环:

for (char vocal : vocals) {
  if (word[i] == vocal) vo++;
}
for (char konsonant : konsonanter) {
  if (word[i] == vocal) ko++;
}

另外,请注意你在“vocals”数组中的音调数量错误:应该是6个,而不是7个。

0

你循环中的条件有误,应该使用 `for (int v = 0; v < sizeof(vocals); v++)`。

此外,请检查您对元音和辅音的条件:如果考虑小写字符会发生什么?'a' != 'A',因此您无法正确计数。 提示:使用 toupper()tolower(),这样您就不需要拥有过多的字符列表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接