2017-10-20 2 views
-1

J'ai écrit du code en C++ pour afficher des caractères en double dans une chaîne, mais si un caractère est répété plus de trois fois, le code imprime le caractère répété plusieurs fois.Afficher les caractères dupliqués dans une chaîne

Par exemple si la chaîne est aaaddbss, elle doit uniquement imprimer ads mais elle imprime aaads à la place.

Qu'est-ce que je fais mal?

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; 
+1

Vraisemblablement c'est C++? Il manque des définitions pour des choses comme 'input'. S'il vous plaît en faire un exemple complet. J'ai l'impression que 'input' n'est pas' std :: string', ce qui devrait être le cas puisque l'utilisation de tampons de caractères bruts est un mauvais plan. – tadman

+1

Je vous suggère de prendre le temps de lire [Comment déboguer les petits programmes] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/) par Eric Lippert, et apprendre à utilisez un débogueur pour parcourir votre code ligne par ligne. Ensuite, il sera très évident quel est le problème. –

+0

@tadman 'input' ne peut pas être' std :: string', puisqu'il ne serait pas compilé s'il l'était. 'cin' n'a pas de surcharge de la méthode' getline' qui accepte 'std :: string'. –

Répondre

3

Au lieu d'utiliser vos propres méthodes personnalisées, pourquoi ne pas utiliser une méthode courte et standard?

Compte tenu d'un std::string input avec le texte, cela affichera les caractères uniques:

std::set<char> unique(input.begin(), input.end()); 
for (auto & c : unique) 
{ 
    std::cout << c << " "; 
} 
std::cout << std::endl; 
1

Vous pouvez utiliser std::count et 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; 


} 

Sortie:

e 
h 
l 
o 
0

Si vous ne sont pas autorisés à utiliser un map (et probablement aussi pas autorisé à utiliser un set), vous pouvez simplement utiliser un tableau d'entiers pour compter les occurrences, avec une entrée pour chaque valeur de char possible. Notez qu'un caractère - pris comme une valeur ASCII - peut être directement utilisé comme index pour un tableau; cependant, pour éviter les indices négatifs, chaque valeur de caractère doit d'abord être convertie en une valeur non signée.

#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; 
}