我试图循环一个单词,但只有元音因某种原因而起作用。另一种类型打印出总数量的单词。请原谅我用瑞典语和英语混合的单词。
#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;
}
答案 0 :(得分:3)
你的循环条件错了。
您可能打算v < vocals[v]
而不是v < 7
,因为您的数组中有7个人声。
写v < vocals[v]
不是错误,因为v
初始化为零,而表达式vocals[v]
是char
,它也可用于数组下标('A'翻译为65,'E'翻译为69,依此类推。)
辅音循环中存在同样的问题。
答案 1 :(得分:1)
您有多个错误,因此我只是按顺序查看所有代码。
如果你写
char vocals[7] = {'A' ... 'Y'};
你必须手动保持数组大小和初始化程序同步 - 例如,你错过了一个(你有7&#34; vocals&#34;在7元素阵列的初始化程序中)。
写错误的可能性较小
char vowels[] = {'A', 'E', 'I', 'O', 'U'};
让编译器为你计算。 (我把它重命名为&#34;元音&#34;因为那是他们用英语打电话的,然后删除了&#39; Y&#39;因为它不是一个 - 显然你可以坚持使用瑞典语。)
同样,这个循环是错误的:
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)) {
答案 2 :(得分: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。
答案 3 :(得分:0)
你在循环中的条件是有缺陷的,你应该使用&#39; for(int v = 0; v&lt; sizeof(vocals); v ++)`。
另外,检查你的声音和辅音的条件:如果你考虑小写字符怎么办? 'a' != 'A'
,因此您无法正确计算它们。
提示:使用toupper()
或tolower()
,这样您就不需要过多的字符列表。