程序产生时髦的输出

时间:2017-10-01 18:18:20

标签: c++

我正在编写一个程序,它接收来自std :: cin的输入流,然后用输入及其频率填充一个包含所有单词的地图容器(在删除所有标点符号并使其小写之后)。

这是我的代码......

#include "prog4.h"


void clean_entry(const string& s1, string& s2) {
    for (int i = 0; i < s2.size(); i++) {//loop through the string
        s2[i] = tolower(s2[i]);
    }
}

void get_words(map < string, int >& map1) {
    string input;
    getline(cin, input);
    string s1;
    for (int i = 0; i < input.size(); i++ , s1 = "") {//loop through 
 entire input
        if (isalnum(input[i]) == 0) {//if its a alphanumeric char
            for (int d = i; isalnum(input[d]) == 0;d++) {//make s1 the 
next set of characters between punctuation
                s1 += input[d];

                if (isalnum(input[d]) != 0)//update i to the next non 
alfanumeric character position
                    i = d;
            }
         }
        clean_entry(s1, s1);
        map1[s1]++;
    }

}

void print_words(const map < string, int >& m1) {
    map<string, int>::const_iterator it;
    cout << "Number of non-empty words: " << m1.size() << '\n';
    int count = 0;
    for (it = m1.begin(); it != m1.end(); it++) {
        if (it->second == 1)
            count++;
    }
    cout << "Number of distinct words: " << count << '\n';
    it = m1.begin();
    for (int y = 0; it != m1.end(); it++,y++) {
        if (y % 3 == 0) {
            cout << '\n';
        }
        cout << setw(20) << it->first << setw(10) << it->second;
     }
}

int main() {
    map <string, int> m1;
    get_words(m1);
    print_words(m1);

    return 0;
}

我测试了打印和清洁方法,它们都按预期工作。我遇到的问题是我毫无疑问地使用了get_words方法。

作为一个例子,当我使用输入&#34;巨大的Muge Cuge luge&#34;这就是我得到的输出......

Number of non-empty words: 2
Number of distinct words: 0


                           16                           3

我不确定导致这种情况发生的原因,在查看代码后我似乎无法找到问题,这就是我在这里发布的原因

1 个答案:

答案 0 :(得分:0)

让我列出一些我在代码中可以看到的问题。

  1. isalnum函数返回字母数字字符的非零值。 这意味着声明 函数if (isalnum(input[i]) == 0) {中的get_words应更改为 if (isalnum(input[i]) != 0) {
  2. 此外,声明for (int d = i; isalnum(input[d]) == 0;d++) {应更改为for (int d = i; isalnum(input[d]) != 0;d++) {

    1. 另一个问题是语句i = d;将不会被执行,因为for循环中断它会跳过这些行,因为条件正好相反。您可以通过将d的声明移出for循环来解决此问题。修改后的功能应为:
    2. =&GT;

      void get_words(map < string, int >& map1) 
      {
          string input;
          getline(cin, input);
          string s1;
          for (int i = 0; i < input.size(); i++ , s1 = "") 
          {
              if (isalnum(input[i]) != 0) 
              {//if its a alphanumeric char
              int d;
                  for (d = i; isalnum(input[d]) != 0;d++) 
                  {
                      s1 += input[d];
                  }
                  if (isalnum(input[d]) == 0)
                      i = d;
              }
              clean_entry(s1, s1);
              map1[s1]++;
          }
      }