我需要创建一个函数,该函数将删除句子和空格中的所有句点
它仅打印出句子的第一个单词,而不是整个句子。如果我输入“ 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';
}
答案 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