PDA

View Full Version : [C] problema scanf() e/o getchar()


Emaborsa
10-07-2010, 16:48
Dopo un anno di università posso dire di saper programmare in JAVA, non sono un mostro, ma me la cavo. Durante l'estate volevo imparare anche C e C#. Iniziato con C: è abbastanza semplice, bene o male le cose basilari sono quelle, in Java usavo JOptionPane e System.in per prendere valori Input tastiera; in C invece posso usare getchar() se è per un char, scanf() mi sembra meglio per int.
Il problema è che se metto più comandi in fila sia di scanf o getchar e poi avvio l'applicazione per testare, me li salta tutti e non mi fa immettere nulla....
Piccolo Esempio:
#include <stdio.h>



#define MAXLINEE 100

#define MAXCOLONNE 100

int mat[MAXLINEE][MAXCOLONNE];


main() {

int n, m;

int i, j;


do {

printf("\nNumero di linee: ");

scanf("%d", &n);

} while ((n >= MAXLINEE) || (n < 1));


do {
printf("\nNumero di colonne: ");

scanf("%d", &m);

} while ((m >= MAXCOLONNE) || (m < 1));


printf("\n \n CARICAMENTO DELLA MATRICE \n \n");

for (i = 0; i < n; i++) {

for (j = 0; j < m; j++) {

printf("\nInserisci linea %d colonna %d linea val: ", i, j);

scanf("d", &mat[i][j]);

}

}

for (i=0; i<n;i++){

printf("\n");

for (j=0; j<m; j++){

printf("%5d", mat[i][j]);

}

}

}

k0nt3
10-07-2010, 16:53
scanf("%d", &mat[i][j]);

e non

scanf("d", &mat[i][j]);

hai dimenticato un % :fagiano:

Emaborsa
10-07-2010, 17:23
Vero..... :doh:
e qui cosa c'è che non va? Non trovo errori:

#include <stdio.h>



main() {

char a, b;

printf("insert a character: ");

a = getchar();


printf("Insert a character: ");

b = getchar();


printf("%c", a);

printf("%c", b);


}

k0nt3
10-07-2010, 17:51
il problema è che getchar è una funzione un pò di basso livello.. quando inserisci il primo carattere devi tenere conto che poi schiacci INVIO e quindi rimane nel buffer un carattere '\n'
potresti ad esempio fare così:

#include <stdio.h>



main() {

char a, b;

printf("insert a character: ");

a = getchar();

printf("Insert a character: ");

while ((b = getchar()) == '\n');

printf("%c\n%c\n", a,b);
}

Emaborsa
10-07-2010, 17:53
ok, allora è proprio un "problema" del C, non della codice scritto male...mistero svelato. Mi è più chiaro usare il scanf().

tuccio`
10-07-2010, 18:45
ok, allora è proprio un "problema" del C, non della codice scritto male...mistero svelato. Mi è più chiaro usare il scanf().un altro modo è fare fflush(stdin) prima della chiamata che svuota il buffer

diciamo che è un problema da questo punto di vista, è un'ottimizzazione (quella del buffer) da altri

wingman87
10-07-2010, 18:54
un altro modo è fare fflush(stdin) prima della chiamata che svuota il buffer

Purtroppo però questo comportamento non è standardizzato (dipende dall' implementazione)

kwb
10-07-2010, 19:00
ok, allora è proprio un "problema" del C, non della codice scritto male...mistero svelato. Mi è più chiaro usare il scanf().
Il problema temo si presenti anche con lo scanf, se inserisci prima numeri e poi caratteri, o viceversa... non vorrei dire vaccate però...

un altro modo è fare fflush(stdin) prima della chiamata che svuota il buffer

diciamo che è un problema da questo punto di vista, è un'ottimizzazione (quella del buffer) da altri

Purtroppo però questo comportamento non è standardizzato (dipende dall' implementazione)
Il mio professore infatti è la prima cosa che ha detto e ci ha proibito di utilizzare fflush per svuotare l'input buffer. Preferisce che utiliziamo la funzione col while scritta da k0nt3

Emaborsa
10-07-2010, 19:24
Il problema temo si presenti anche con lo scanf, se inserisci prima numeri e poi caratteri, o viceversa... non vorrei dire vaccate però...


Con la scanf() non ho questi problemi.... Comunque terrò in considerazione la funzione col while scritta da k0nt3.