我一直在努力进行作业分配,该作业需要计算字符串中大写字母,小写字母和数字的实例数量。出现在字符串中。
我正在使用常量大小为132的一维数组来存储输入的字符串,并且我需要使用两个函数。一个需要计算字符串中字母出现的数量,另一个函数将执行类似于上面的输出。我在程序本身的字母计数方面最苦恼。
目前,这是我目前的家庭作业大部分类似于的内容。 (这是一项正在进行中的工作,因此代码中很可能会出现错误。
void LetterCount(char c_input[], int l_count)
{
// code to count letters
}
void CountOut(//not sure what should go here yet until counting gets figured out)
{
// code that handles output
}
int main()
{
const int SIZE = 132;
char CharInput[SIZE];
int LetterCount = 0;
cout << "Enter a string of up to 132 characters in size: ";
cin.getline(CharInput, SIZE);
cout << "You entered: " << CharInput << endl;
Count(CharInput);
CountOut(//not sure what goes here yet);
return 0;
}
输出看起来像:
a - 2
b - 1
c - 1
d - 0
e - 1
等...
我尝试了一些for循环来对字母进行计数,并看到了gcount()函数的一些示例,但是我什么都没做。有人对我如何计算输入字符串中的字母有建议吗?
答案 0 :(得分:4)
map
是非常有效的数据结构
#include <iostream>
#include <map>
using namespace std;
int main(){
string str = "a boy caught 2 fireflies";
map<char, int> str_map;
for(auto x : str) ++str_map[x];
for(auto x : str_map) cout << x.first << ' ' << x.second << '\n';
}
答案 1 :(得分:1)
您想要的是构建一个简单的histogram,这很容易做到。由于您要查看的是chars
,并且8位char
可能有256个值(实际上,您的输入字符串可能使用的更少,但这里我们会比较保守,因为内存很便宜),则需要从256个ints
数组开始,并将它们全部初始化为零。然后遍历字符串chars
,对于字符串中的每个char
,使用该char值作为array(*)的偏移量,并简单地增加数组中的该项。>
完成后,剩下的就是遍历数组中的ints
并打印出非零值,然后就可以了。
(*),您可能需要在将char
转换为unsigned char
之前将其用作数组的偏移量,以避免任何可能将其解释为负数组索引的机会,会导致不确定的行为(这仅在您的输入字符串包含ASCII个128个及更高字符的情况下才是问题,因此在您的情况下可能无关紧要,但这始终是使代码在所有情况下都能正确完成工作的好形式可以的话)
答案 2 :(得分:0)
正如杰里米·弗里斯纳(Jeremy frisner)所说,您正在构建直方图,但我不同意所使用的类型。
您将要这样声明直方图:
size_t histogram[sizeof(char)*CHAR_BIT] = {0};
size_t,因为如果没有它,可能会溢出,并且如果它是非标准字节大小,则需要足够的空间。
关于打印出来。您应该查看ASCII表并检查需要打印哪些值。
答案 3 :(得分:0)
您可以通过将c字符串与其他c字符串进行比较来实现。但是使用字符和字符串,您会得到类似以下错误:“ const * char无法与字符串进行比较”。因此,您必须将每个c字符串(数组)索引与其他c字符串索引进行比较。在此程序中,我使用if语句查找某些元音。它的工作方式是每个“字符串字母字母”等于其各自的小写和大写字母(供比较)。这是一种非常多余的方法,并且,如果您想计算所有字母总数,也许您应该尝试使用另一种方法,但是这种方法并不使用需要更深入理解的非常复杂的方法。
Upstream url path is /api/account/user/list/GetPagedAgents