[C] Stampare cifre ripetute
buona sera ho un problema devo creare un programma che dopo aver inserito una serie di numeri lui mi stampi i numeri ripetuti(se ce ne sono).
questo dovrebbe essere l'output
Enter a number: 939577
Repeat digit: 7 9
io ho iniziato cos'ì
#include
int main(void)
{
int vett[6];
int numeri, digit;
printf("digita i numeri ");
scanf("%d",&numeri);
while(numeri>0){
digit=numeri%10;
vett[digit]++;
numeri/=10;
}
return 0;
da qui in poi non ho minimamente idea di come devo fare(sopratutto non so proprio come far stampare la cifra ripetuta)...
questo dovrebbe essere l'output
Enter a number: 939577
Repeat digit: 7 9
io ho iniziato cos'ì
#include
int main(void)
{
int vett[6];
int numeri, digit;
printf("digita i numeri ");
scanf("%d",&numeri);
while(numeri>0){
digit=numeri%10;
vett[digit]++;
numeri/=10;
}
return 0;
da qui in poi non ho minimamente idea di come devo fare(sopratutto non so proprio come far stampare la cifra ripetuta)...
Risposte
Ho implementato diversamente, ma potresti comunque usare l'idea finale con la tua implementazione. Nel mio codice c'è una criticità: se inserisci più di 99 numeri vai in buffer overflow 

#include <stdio.h> #define STRLEN 100 int main(void) { char str[STRLEN]; int repeat[10] = { }; printf("Inserisci i numeri (senza spazi): "); scanf("%s", str); for (size_t i = 0; str[i] != '\0'; i++) { int num = ((int) str[i]) - 48; //printf("%d", num); if (num < 10) repeat[num]++; else puts("!!"); } printf("%s", "I numeri ripetuti sono: "); int j = 0; for (size_t i = 0; i < 10; i++) { if (repeat[i] > 1) { j++; printf("%d ", i); } } if (!j) { printf("Nessun numero ripetuto!"); } puts(""); }
grazie mille... domani provo, e se ho ancora problemi ti riscrivo ancora....
grazei e buona serata
grazei e buona serata
Fammi sapere 
Ciao!

Ciao!
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:
@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!!
* 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.
#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!!
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.
"apatriarca":
Non c'è alcuna garanzia che i caratteri siano in ASCII.
Effettivamente hai ragione.
"apatriarca":
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.
Se hai visto lo avevo scritto. In realtà di primo acchitto avevo usato scanf_s ma non facendo parte dello standard C99 lo ho tolto

Comunque si, meglio leggere un carattere per volta, ma mi volevo attenere al suo input

scusa se ti rispondo solo ora, dopo un po di giorni di prove sono finalmente riuscito a far andare il programma come volevo..
grazie mille epr l'aiuto.
grazie mille epr l'aiuto.