2

我有一个向量 vec (256, 0) 用于记录输入文件中的字符类型及其频率。因此,给定 3 A,我的 vec[65] 将保持值为 3。我正在尝试将计数非空字符的总数写入输出文件,然后是它们的 ascii 字符和出现频率。

int count = 0;
for (int i = 0; i < 256; i++)
  if (vec[i] != 0)  // if not 0 count it
    count++;

// print the count as the first char in output file
outfile << count;

for (int i = 0; i < 256; i++)
  if (vec[i] != 0)
    outfile << (char) i << vec[i];

给定输入“a bb c”我想要的是:

4a1b2c1

但我得到的是:

5

1 2a1b2c1

我能做些什么来解决这个问题?

4

4 回答 4

0

使用这段代码:

int count = 0;
for (int i = 0; i < 256; i++)
  if (i != 32 && i != 10 && i != 13)  // don't count ' ' (spaces) and other stuff
    count += vec[i]; //(not all vec[i] values are 1, 98 for instance is 2 (bb))

cout << count;

for (int i = 0; i < 256; i++)
 if (i != 32 && i != 10 && i != 13 && vec[i] != 0)
    cout << (char) i << vec[i];
于 2013-08-23T21:04:25.863 回答
0

我建议使用地图来存储计数。

在 Coliru 上看到它

#include <map>
#include <iostream>

std::map<char, size_t> histogram(std::string const& input)
{
    std::map<char, size_t> freq;
    for (auto ch : input)
        freq[ch]++;

    return freq;
}

int main()
{
    std::string input = "hello world (or read this from a large file";

    auto frequencies = histogram(input);

    for (auto& entry : frequencies)
        std::cout << "'" << entry.first << "': " << entry.second << "\n";
}

这打印

' ': 8
'(': 1
'a': 3
'd': 2
'e': 4
'f': 2
'g': 1
'h': 2
'i': 2
'l': 5
'm': 1
'o': 4
'r': 5
's': 1
't': 1
'w': 1

哦,对于不可印刷品,

std::cout << "char: 0x" << std::setw(2) << std::ios::hex << entry.first;

很高兴获得0x07ASCII 7 等。

于 2013-08-23T21:14:36.393 回答
0

我假设您输入的内容中有一个换行符和两个空格字符。然后,在字符总数的五个之后,打印换行符,然后是它出现的次数,然后是空格字符,然后是两个字符,然后是其他字符。

编辑

我了解您不想在计数中包含换行符和空格字符以及类似的控制字符。然后,当您填充向量时,您将不得不排除它们。假设您当前的字符在一个char名为 的变量中c,那么您将使用类似

if(c > ' ') {
    /* do the stuff of increasing the count for c as you do it currently */
}
于 2013-08-23T20:16:33.873 回答
0

您的输入文件如下所示:“a bb c\r\n”而不是“a bb c”。这意味着您有五种字符类型:一种'\n'(ASCII 码:10),一种'\r'(ASCII 码:13),两种空格(ASCII 码:32),一种'a',两种'b ' 字符和一个 'c'。所以你的代码可以正常工作!问题是,当您将 '\r'、'\n' 和 ' ' 打印到输出文件中时,它们将显示为空格。

如果从输入文件中删除换行符,以获取“a bb c”作为输入,输出将是:“4 1a1b2c1”,因为空格的 ASCII 码小于 'a' 的 ASCII 码。

于 2013-08-23T20:18:09.587 回答