C++将字符与字符串进行比较
C++ comparing Char to Strings
我试图循环一个单词,但由于某种原因只有元音在工作。另一种类型打印出总共的单词数。请原谅我用瑞典语和英语混合的单词选择得很差。
#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()
,这样您就不需要过多的字符列表。
- 视觉C++使用 map 来比较字符串中的每个单词
- 我正在尝试从输入文件中读取,然后使用它们的子字符串比较字符串的特定部分
- 比较字符串的 GetLine 工作一次,然后比较之后不起作用
- C++使用关系运算符比较字符串
- 通过默认复制构造函数比较 C++ 字符串是否会影响性能,原因为何?
- C++ TCP 服务器比较字符串失败
- 如何在不复制的情况下比较字符串的一部分?
- 比较 C++ 字符串打印中的两个整数数组
- 如何比较字符串形式的临时变量
- std::out_of_range 比较字符串中的符号时出错
- 比较字符串大小写不区分的简单方法是什么?
- 比较字符串忽略 NUL
- 比较字符串(arduino)时出现问题
- 如何在C++中比较字符串
- 比较字符串对象等于向量中的元素
- C 比较字符串操作速度
- 需要比较字符串的某些元素
- 比较字符串 .c_str() 和普通字符串的差异
- C 比较字符串的字符
- 通过使用两个不同的队列比较字符串