【问题标题】:Why does my array contain letters that I have not entered?为什么我的数组包含我没有输入的字母?
【发布时间】:2021-08-03 14:04:29
【问题描述】:

我在处理一段代码时遇到了问题。我正在尝试在布尔函数中计算直方图。我有我为另一个程序编写的这段代码,我知道它是有效的。现在的区别在于它在 if 和 else if 语句中。该程序从用户那里获取一个字符串并将其存储在一个数组中。该数组是循环遍历的,预计会计算字母的数量,例如输入的 H:s 总数以及输入的字母总数,例如总共输入 10 个字母。

我现在得到的是,假设我输入了文本:“你好”。我得到的总数为 7(总是比我输入的多两个,但如果我输入一个空字符串则不会)。它总是一个额外的“H”和“O”。所以对于“你好”,我得到: e: 1 小时:2 升:2 o: 2

我完全不知道这里发生了什么,我也不确定要搜索什么。我对 C++ 很陌生。

bool Text::beraknaHistogramAbs(){
int i = 0;
int j = 0;

if (inText.empty()){
    cout << "Tom textrad!" << endl;
    exit (EXIT_FAILURE);

}

else if(!inText.empty()) {
    for (i = 0; i < ANTAL_BOKSTAVER; i++){ //ANTAL_BOKSTAVER is 26.
        if (inText[i] >= 'a' && inText[i] <= 'z'){ //inText is the string from the user.
            j = inText[i] - 'a';
            ++absolutHisto[j]; //Is initialized to zero in the default constructor.
    }
        if (inText[i] >= 'A' && inText[i] <= 'Z'){
            j = inText[i] - 'A';
            ++absolutHisto[j];
    }
}
for (i = 0; i < ANTAL_BOKSTAVER; i++){
    antal += absolutHisto[i]; //antal is an integer for the total number of letters.
}
return true;
}
}

我猜我的 else if 语句有问题,因为这段代码在另一个程序中运行,它通过了一个 while 循环。

编辑!!展示如何创建 inText。

void Text::setText(const string &nyText){

cout <<"Ge en rad med text:" << endl;
getline(cin,inText);

【问题讨论】:

  • 请尝试创建minimal, reproducible example。现在无法诊断问题,因为例如,我们看不到 inText 的声明,也看不到填充它的过程。
  • 你让 i 从 0 循环到 26 并使用它来访问 inText。你不应该让i 停在inText.length() 上吗?
  • 是时候试试你的调试器了......和一步。
  • 我不能“证明你错了”,除非你像别人说的那样展示inText是如何创建和填充的。

标签: c++ arrays histogram


【解决方案1】:

编辑显示循环正在读取输入字符串的末尾。

!inText.empty() 检查后的第一个循环应该是

for (i = 0; i < inText.length(); i++)

或者,您可以将整个内容写成:

for (const char x : inText) {
    if (x >= 'A' && x <= 'Z') { absolutHisto[x-'A']++; }
    if (x >= 'a' && x <= 'z') { absolutHisto[x-'a']++; }
}

【讨论】:

  • 谢谢!!!现在的输出是我所期望的。 “你好”给了我 5 个字符,直方图按预期打印。非常感谢您的帮助,谢谢。
  • 循环内的两个条件可以通过使用 islower(x) 和 isupper(x) 变得更具可读性。将第二个 if 放在第一个 if 的 else 子句中会更有效,因为一个字符不能同时是小写和大写。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-31
  • 2017-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-22
相关资源
最近更新 更多