Perché nel tuo codice hai usato un array con \(6\) elementi? Le cifre possibili sono ovviamente \(10\).. C'è inoltre il problema che la stringa numerica possa rappresentare un numero più grande di quello rappresentabile in un intero. Sarebbe quindi più robusto leggere semplicemente i caratteri da stdin uno per volta. Qualcosa come il seguente insomma:
- Codice:
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
fputs("Enter a number: ", stdout);
// Ignore spaces before the number
int c = getc(stdin);
while(isspace(c)) { c = getc(stdin); }
// Test if a number has been given
if (!isdigit(c)) {
fputs("Invalid input.", stderr);
return EXIT_FAILURE;
}
// Count digits
int digit_count[10] = { 0 };
while (isdigit(c)) {
digit_count[c - '0']++;
c = getc(stdin);
}
// Print digits repeated multiple times
fputs("Repeat digit: ", stdout);
for (char i = 0; i < 10; ++i) {
if (digit_count[i] > 1) {
putc('0' + i, stdout);
}
}
puts("");
}
@mark97: Non c'è alcuna garanzia che i caratteri siano in ASCII. E' in generale cattiva idea quella di usare codici numerici che fanno affidamento su dettagli di programmazione, per quanto comuni come la codifica ASCII. Costanti come '0' sono più leggibili e portabili di 48. Leggendo un codice con costanti come '0', 'a', 'Z', etc. se ne comprende subito il senso. Le corrispondenti costanti 48, 97 e 90 sono molto più ambigue e in generale richiedono una ricerca su internet (almeno per quanto mi riguarda*).
La lettura di una stringa usando scanf è una pessima idea a meno di inserire anche la dimensione massima che si può scrivere in tale stringa. La stringa di formato nel tuo caso avrebbe per esempio dovuto essere "%99s". Ma come ho mostrato nel mio codice non c'è alcuna ragione di avere una dimensione massima in quanto si può semplicemente leggere un carattere per volta.
Il seguente codice non ha senso. Una stringa di formato può contenere qualsiasi testo!!
- Codice:
printf("%s", "I numeri ripetuti sono: ");
// è equivalente al seguente:
printf("I numeri ripetuti sono: ");
// o a
fputs("I numeri ripetuti sono ", stdout);
* Conosco qualche valore, ma non sempre il valore è in decimale. Per esempio mi ricordo i codici per cose come '~' in decimale ma dello spazio in esadecimale.