C++将字符与字符串进行比较

C++ comparing Char to Strings

本文关键字:比较 字符串 字符 C++      更新时间:2023-10-16

我试图循环一个单词,但由于某种原因只有元音在工作。另一种类型打印出总共的单词数。请原谅我用瑞典语和英语混合的单词选择得很差。

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

你的循环条件是错误的。 您可能不是v < vocals[v]而是想写v < 7,因为数组中有 7 个人声。

写入v < vocals[v]不是错误,因为v被初始化为零,而表达式vocals[v]是一个char,也可以在数组下标中使用("A"转换为65,"E"转换为69,依此类推)。

辅音的循环中也存在同样的问题。

您有多个错误,因此我将按顺序对所有代码进行注释。

如果你写

char vocals[7] = {'A' ... 'Y'};

您必须手动保持数组大小和初始值设定项同步 - 例如,在这里您错过了一个(对于 7 元素数组,您的初始值设定项中有 6 个"人声")。

编写时不易出错

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

并让编译器为您计数。(我把它改名为"元音",因为这是他们在英语中的称呼,并删除了"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)) {

您的错误在于"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++;
}

另外,请注意,您在"人声"数组中弄错了人声数量:它是 6,而不是 7。

循环中的条件是有缺陷的,你应该使用'for (int v = 0; v <sizeof(vocals);>

另外,检查您的语音和辅音状况:如果您考虑小写字符会发生什么?'a' != 'A',所以你没有正确计算它们。 提示:使用toupper()tolower(),这样您就不需要过多的字符列表。