我的任务是删除所有多余的空格(应保持1(,只输出那些字母重复的单词。我已经坐了一个星期了,找不到错误,也许这会对我有所帮助((我已经弄清楚了空白,但单词格式我做不到(
请帮我在我的代码中找到一个错误
如果我输入我喜欢每天踢足球,程序应该每输出足球。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int main()
{
char str[128];
printf("Write String: ");
fgets(str, 128, stdin);
int i = 0, j;
i = 0;
int start = i;
while (str[i] != ' ')
{
if (str[i] == ' ' || str[i] == 'n')
{
int end = i;
int first = start;
int first2 = start + 1;
int last = end - 1;
while (first < last)
{
for (first; first < last; first++)
{
for (first2; first2 < last; first2++)
{
if ((str[first] == str[first2]) && (first != first2))
{
break;
}
else
{
if((first == last - 1) && (first2 == last - 1))
{
for (j = start; str[end] != ' '; ++end)
{
str[j] = str[end + 1];
j += 1;
}
}
}
}
}
}
if (i != start)
{
start = i + 1;
++i;
}
}
else
{
++i;
}
}
}
一个可能的解决方案:
- 一次读一个单词,然后
- 检查每个单词是否有重复的字母。如果是,请打印单词
现在,如何一次读取输入的一个单词。在下面的例子中,我使用了std::istringstream
,但std::cin
可以
以及,如何检查一个单词是否有重复的字母。一种简单但肯定不是最快的方法是从输入字符串创建一个集合,并检查该集合和字符串的字母数是否不相同。我已经为has_a_repeated_letter
使用了lambda,但函数可以。
【演示】
#include <iostream> // cout
#include <set>
#include <string>
#include <sstream> // istringstream
int main() {
std::istringstream iss{"I like to play soccer every day"};
auto has_a_repeated_letter = [](const std::string& word) {
std::set<char> letters{ word.begin(), word.end() };
return letters.size() != word.size();
};
std::string word{};
while (iss >> word) {
if (has_a_repeated_letter(word)) {
std::cout << word << " ";
}
}
}
// Outputs:
//
// soccer every