我在C ++中编写了一些代码来在字符串中显示重复的字符,但是如果一个字符重复了三次以上,代码会多次打印重复的字符。
例如,如果字符串为aaaddbss
,则只能打印ads
,但会打印aaads
。
我做错了什么?
cout << " Please enter a string" << endl;
cin.getline(input, 100); // example input (ahmad wahidy) the output reads a a h a d instead of a h d
for (int i = 0;input[i]!='\0'; i++)
{
for (int j = i+1;input[j]!='\0'; j++)
{
if (input[i] == input[j])
{
cout << input[i] << " ";
}
}
}
cout << endl;
答案 0 :(得分:3)
为什么不使用简短的标准方法,而不是使用自己的自定义方法?
给定std::string input
文本,这将打印唯一的字符:
std::set<char> unique(input.begin(), input.end());
for (auto & c : unique)
{
std::cout << c << " ";
}
std::cout << std::endl;
答案 1 :(得分:1)
您可以使用std::count
和std::set
:
#include <string>
#include <set>
#include <iostream>
using namespace std;
int main()
{
string s = "hellohowareyou";
set<char>the_set(s.begin(), s.end());
for (char i:the_set)
if (count(s.begin(), s.end(), i) > 1)
cout << i << endl;
}
输出:
e
h
l
o
答案 2 :(得分:0)
如果您不被允许使用map
(并且可能也不允许使用set
),您可以简单地使用整数数组来计算出现次数,每次可能有一个条目char值。请注意,字符 - 当作为ASCII值时 - 可以直接用作数组的索引;但是,为避免负指数,应首先将每个字符值转换为无符号值。
#include <iostream>
#include <limits>
int main() {
const char* input = "aaaddbss";
int occurrences[UCHAR_MAX+1] = { 0 };
for (int i = 0;input[i] !='\0'; i++)
{
unsigned char c = input[i];
if (occurrences[c]==0) {
occurrences[c]++;
}
else if (occurrences[c]==1) {
occurrences[c]++;
cout << "duplicate: " << c << endl;
}
}cout << endl;
}