首页 > 解决方案 > 尝试一次将单个字符读入一个不定大小的数组

问题描述

我是一名从事 c++ 项目的 CS 学生。我们被指示声明一个结构并使用它来读取字符数组并记录字符串中使用了多少个字母。我们不允许使用字符串;它必须是我们声明的结构的数组。输入必须是用户想要的长度;代码必须能够接受新的输入行并以“。”终止 我真的在这里挣扎。我什至不知道从哪里开始。我已经整理了一些代码作为最好的猜测,但是在按下“。”后它崩溃了。然后进入,我不知道为什么。

//declare struct
struct data
{
    int tally = 0;
    char letter;
};

//size of string to read in at a time
const int SIZE_OF_CHUNK = 11;
int main()
{
//input chunk of struct
data    input[SIZE_OF_CHUNK];
int     placemark,
        length;

cout << "Enter sequence of characters, '.' to terminate:" << endl;

do
{
    for (int index = 0; (input[index].letter != '\0') && (input[index - 1].letter != '.'); index++)
    {
        cin >> input[index].letter;
        placemark++;
    }

    //I intend to put something here to handle if the code
    needs to read in another chunk, but I want to fix the crashing
    problem first
}
while (input[placemark].letter != '.');

//print out what was read in, just to check
for (int index = 0; input[index].letter != '\0'; index++)
{
    cout << input[index].letter;
}

return 0;
}

我已经尝试查找如何阅读单个字符,但到目前为止还没有发现任何对我的情况有帮助的东西。任何关于我做错了什么的提示,或者我可以在哪里找到有用的资源,将不胜感激。

标签: c++arraysinputstruct

解决方案


你确定你必须使用声明的结构吗?

如果只想统计一个字符出现的次数,则不需要存储该字符;你只需要存储它出现的次数。所以只是unsigned lettersCount[26],并且每个索引都映射到一个字母(即 index0表示a, index1表示b)。每当出现字母时,只需增加该索引的计数即可。

您可以使用ASCII将字母映射到索引。每个字母都由一个十进制数字表示,您可以在ASCII 表中查找它。例如,字母a用十进制值97表示,b是98等等。数量不断增加,我们可以利用。所以如果你想将一个字母映射到一个索引,你需要做的只是value - 97or value - 'a'。例如,如果你读到这封信a,从中去掉 97,你会得到0,这就是你想要的。++获得索引后,增加该字母的计数就很简单了。

关于大写和小写的处理(即相同或不同的处理方式),由您自己决定如何处理(如果您能理解我的解释,这应该相当简单)。


推荐阅读