c++ - 尝试一次将单个字符读入一个不定大小的数组
问题描述
我是一名从事 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;
}
我已经尝试查找如何阅读单个字符,但到目前为止还没有发现任何对我的情况有帮助的东西。任何关于我做错了什么的提示,或者我可以在哪里找到有用的资源,将不胜感激。
解决方案
你确定你必须使用声明的结构吗?
如果只想统计一个字符出现的次数,则不需要存储该字符;你只需要存储它出现的次数。所以只是unsigned lettersCount[26]
,并且每个索引都映射到一个字母(即 index0
表示a
, index1
表示b
)。每当出现字母时,只需增加该索引的计数即可。
您可以使用ASCII将字母映射到索引。每个字母都由一个十进制数字表示,您可以在ASCII 表中查找它。例如,字母a
用十进制值97表示,b
是98等等。数量不断增加,我们可以利用。所以如果你想将一个字母映射到一个索引,你需要做的只是value - 97
or value - 'a'
。例如,如果你读到这封信a
,从中去掉 97,你会得到0
,这就是你想要的。++
获得索引后,增加该字母的计数就很简单了。
关于大写和小写的处理(即相同或不同的处理方式),由您自己决定如何处理(如果您能理解我的解释,这应该相当简单)。
推荐阅读
- webgl - 关于 gl.COLOR_BUFFER_BIT 变量的混淆
- sql - 如何在 Oracle 数据库或 ASP.NET MVC 中比较两个表之间不匹配的数据并连续显示它们
- html - 如何让图像和文本彼此对齐
- r - R图例未显示在绘图中
- python - 上一批Pytorch损失函数错误
- ios - 如何从 UIDocumentPicker、didPickDocumentsAt urls 获取正确的文件名:[URL]
- vue.js - Vue:选择后vue-select中的下拉框不显示值
- javascript - 为安全访问级别分配优先级
- c# - 我有一个私人发布的 Windows 商店应用程序调用 GetAppReceiptAsync()。如何获取应用收据?
- html - 如何使用 flexbox 移动块中的第三个元素?