删除句点和空格的功能

时间:2019-11-12 04:55:13

标签: c++

我需要创建一个函数,该函数将删除句子和空格中的所有句点

它仅打印出句子的第一个单词,而不是整个句子。如果我输入“ hello。我的名字是”,它将仅显示“ hello”,但会删除句点。我还需要删除空格,这是到目前为止的代码

#include<string>
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<fstream>

using namespace std;
void removePun(char len, string str);
void removeSpaces(char str);
int main()
{
  string sentence;
  char len;
  getline(cin,sentence);
  removePun(len,sentence);
  removeSpaces(len);

  return 0;

}

void removePun(char len, string str)
{

  for (int i = 0, len = str.length(); i < len; i++)
    {
        if (ispunct(str[i]))
        {
            str.erase(i--, 1);
            len = str.size();
        }
    }

   cout << str;
}
void removeSpaces(char *str)
{
  int count = 0;
    for (int i = 0; str[i]; i++)
    {
      if (str[i] != ' ')
      {
      str[count++] = str[i];
      }
    }

    str[count] = '\0';

}

2 个答案:

答案 0 :(得分:2)

原因是因为cin始终将空格(空格,制表符,换行符...)视为要输入的值的终止符,因此提取字符串意味着始终提取一个单词,而不是短语或整个句子。

要从cin中获得整行,存在一个名为getline的函数,该函数将流(cin)作为第一个参数,并将字符串变量作为第二个参数。例如:

string removeEvery(string str)
{
  int len = str.size();
  for (int i = 0; i < len; i++)
    {
        if (ispunct(str[i]))
        {
            str.erase(i--, 1);
            len = str.size();
        }
    }

   return str;
}

int main()
{
  string sentence;
  getline(cin, sentence);
  sentence = removeEvery(sentence);
  cout << sentence;
  return 0;
}

请注意,removeEvery现在会返回一个string,因为您所做的更改是该函数的本地更改。如果您要使清理后的字符串在removeEvery中是本地的,则可以按原样保留它,只需调用getline函数即可。官方参考中有关于输入/输出处理here的更多信息。

答案 1 :(得分:0)

您的定期删除代码没有错。我认为不打印整个句子的原因是因为您使用的是cin >>,它使用空格作为分隔符,并且仅提取整个句子的一部分。您可以使用getline来解决此问题。

#include<string>
#include<iostream>
#include<string>
#include<sstream>
#include<vector>
#include<algorithm>

bool compareSongs(std::string a, std::string b)
{
    return a < b;
}

void sortSongsAlphabetically(std::vector<std::string> &songs)
{
    std::sort(songs.begin(), songs.end(), compareSongs); 
}

std::string clean(std::string input)
{
    std::string new_string;
    std::stringstream ss{input};
    std::string word;

    /* parse sentence word by word to remove multiple spaces */
    while(ss >> word) {
       for (char c : word) {
            if (std::isalnum(c) && !std::isspace(c)) {
                new_string += c;
            } 
        }
        new_string += " ";
    }
    return new_string;
}

int main()
{
    std::vector<std::string> songs;
    std::string input;

    const int max_songs = 5;
    int songs_count = 0;

    while(getline(std::cin, input) && songs_count < max_songs) {
        std::string song = clean(input);
        songs.push_back(song); 
    }

    /* sort songs alphabetically */
    sortSongsAlphabetically(songs);

    std::cout << "Alphabetically sorted songs:" << std::endl;
    for (auto song : songs) {
        std::cout << song << std::endl;
    }

    return 0;

}

您可以看到它live