尝试一次将单个字符读入不确定大小的数组中

时间:2018-06-24 21:39:42

标签: c++ arrays input struct

我是一名CS学生,从事c ++项目。我们被指示去声明一个结构,并使用它来读取字符数组,并保持该字符串中使用多少个字母的计数。我们不允许使用字符串。它必须是我们声明的结构的数组。 输入的时间必须与用户所需的时间相同。该代码必须能够接受新的输入行并以“。”终止。 我真的在这里挣扎。我什至不知道从哪里开始。我已经将一些代码汇总为最佳方法,但是在按“”之后它会崩溃。然后输入,我不知道为什么。

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

我已经尝试查找单个字符的阅读方式,但到目前为止,还没有发现任何对我的情况有用的信息。任何关于我做错事情或在哪里可以找到有用资源的提示,将不胜感激。

1 个答案:

答案 0 :(得分:1)

确定要使用声明的结构吗?

如果您只想计算一个字符出现的次数,则无需存储该字符。您只需要存储它出现的次数。因此只需{},每个索引都映射到一个字母(即索引unsigned lettersCount[26]表示0,索引a表示1)。每当出现字母时,只需增加该索引的数量即可。

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

关于大写和小写的处理(即,对它们进行相同或不同的处理),将由您决定如何执行(如果您能理解我的解释,这应该非常简单) )。