Pagina 1 di 1
[C] - Creare quadrato con caratteri - [RISOLTO]
Inviato: dom 19 lug 2009, 1:57
da SIV
Ragazzi devo fare una stupidaggine in C.
Inserito un numero(side) ed un carattere(c) deve venire fuori un quadrato con dimensioni side*side, formato dal carattere c.
Ho scritto questo, ma non funge:
Codice: Seleziona tutto
#include<stdio.h>
int main(){
int side=0,i=0;
char c;
printf("Inserisci il lato del quadrato:");
scanf("%d",&side);
printf("\nInserisci il carattere da visualizzare:");
scanf("%c",&c);
for (i=0; i<(side*side); i++){
if(i%side==0){printf("\n");}
printf("%c",c);
}
printf("\n\n");
return 0;
}
L'output che mi viene fuori è qualcosa de genere:
Codice: Seleziona tutto
muller@sab-muller ~/Test C $ ./a.out
Inserisci il lato del quadrato:3
Inserisci il carattere da visualizzare:
muller@sab-muller ~/Test C $
Non mi fa neanche immettere il carattere!
Però se sostituisco il carattere (c) ad un intero, così:
Codice: Seleziona tutto
#include<stdio.h>
int main(){
int side=0,i=0;
int c;
printf("Inserisci il lato del quadrato:");
scanf("%d",&side);
printf("\nInserisci il carattere da visualizzare:");
scanf("%d",&c);
for (i=0; i<(side*side); i++){
if(i%side==0){printf("\n");}
printf("%d",c);
}
printf("\n\n");
return 0;
}
Funge, difatti l'output è:
Codice: Seleziona tutto
muller@sab-muller ~/Test C $ ./a.out
Inserisci il lato del quadrato:3
Inserisci il carattere da visualizzare:3
333
333
333
muller@sab-muller ~/Test C $
Re: [C] - Creare quadrato con caratteri
Inviato: dom 19 lug 2009, 2:37
da metrofox
Non puoi utilizzare scanf per un carattere, prova con getchar():
Codice: Seleziona tutto
#include<stdio.h>
int main(){
int side=0,i=0;
char c;
printf("Inserisci il lato del quadrato:");
scanf("%d",&side);
printf("\nInserisci il carattere da visualizzare:");
for (i=0; (c=getchar() != \n) && i<(side*side); i++){
if(i%side==0){printf("\n");}
printf("%c",c);
}
printf("\n\n");
return 0;
}
Sono anche io alle prime armi col C e per ora non ho possibilità di compilare

Prova tu...
Re: [C] - Creare quadrato con caratteri
Inviato: dom 19 lug 2009, 2:52
da SIV
Grazie della risposta.
Nel tuo source mi segnala subito un errore a quel
!= \n
Quindi l'ho messo tra virgolette:
Codice: Seleziona tutto
#include<stdio.h>
int main(){
int side=0,i=0;
char c;
printf("Inserisci il lato del quadrato:");
scanf("%d",&side);
printf("\nInserisci il carattere da visualizzare:");
for (i=0; (c=getchar() != "\n") && i<(side*side); i++){
if(i%side==0){printf("\n");}
printf("%c",c);
}
printf("\n\n");
return 0;
}
Ma l'errore è:
Codice: Seleziona tutto
muller@sab-muller ~/Test C $ gcc prova.c
prova.c: In function ‘main’:
prova.c:10: warning: comparison between pointer and integer
muller@sab-muller ~/Test C $
Mentre se metto solo tra apici:
Codice: Seleziona tutto
for (i=0; (c=getchar() != '\n') && i<(side*side); i++){
L'output è:
Codice: Seleziona tutto
muller@sab-muller ~/Test C $ ./a.out
Inserisci il lato del quadrato:3
Inserisci il carattere da visualizzare:
muller@sab-muller ~/Test C $
Re: [C] - Creare quadrato con caratteri
Inviato: dom 19 lug 2009, 2:54
da targzeta
L'errore mi sembra che sia un altro, la scanf potrebbe essere usata, anche se sconsigliata. Se mi date un attimo ve lo dico, solo che alle 3:00 di notte...il cervello dorme
Emanuele
Re: [C] - Creare quadrato con caratteri
Inviato: dom 19 lug 2009, 3:08
da targzeta
Ho provato a fare di meglio ma il codice è questo
Codice: Seleziona tutto
#include<stdio.h>
int main()
{
int side, i;
char c;
printf("Inserisci il lato del quadrato: ");
scanf("%d", &side);
printf("\nInserisci il carattere da visualizzare: ");
scanf("\n%c", &c);
for (i=0; i<(side*side); i++)
{
if(i%side==0)
printf("\n");
printf("%c",c);
}
printf("\n\n");
return 0;
}
e dovrebbe funzionare.
Il problema sta nel fatto che tu richiedi a scanf di leggerti un intero (prima invocazione) e di metterlo in side. Però tu da tastiera gli passi sia l'intero che il '\n' un carattere. Quindi la prossima invocazione di scanf, che guarda caso voleva un carattere, si becca il '\n'.
Almeno questo è quello che sembra, ma a quest'ora è difficile essere lucidi

,
Emanuele
Re: [C] - Creare quadrato con caratteri
Inviato: dom 19 lug 2009, 3:15
da SIV
Sì funziona!
Quindi il nocciolo sta in:
Passando anche \n al carattere c

Re: [C] - Creare quadrato con caratteri
Inviato: dom 19 lug 2009, 3:20
da targzeta
No, io dico a scanf che si deve aspettare in input un carattere '\n' e poi un carattere, quest'ultimo lo deve mettere in c. Funzionerebbe anche se al posto di '\n%c' della scanf ci metti, prima della scanf un
per fare il flush dello stdin. Non so se mi sono spiegato meglio.
In pratica questo codice funziona:
Codice: Seleziona tutto
#include<stdio.h>
int main()
{
int side, i;
char c;
printf("Inserisci il lato del quadrato: ");
scanf("%d", &side);
getchar();
printf("\nInserisci il carattere da visualizzare: ");
scanf("%c", &c);
for (i=0; i<(side*side); i++)
{
if(i%side==0)
printf("\n");
printf("%c",c);
}
printf("\n\n");
return 0;
}
Emanuele
Re: [C] - Creare quadrato con caratteri
Inviato: dom 19 lug 2009, 3:25
da SIV
Sì.
Ho provato anche mettendo getchar() prima della prima scanf e funge:
Codice: Seleziona tutto
#include<stdio.h>
int main()
{
int side, i;
char c;
printf("\nInserisci il carattere da visualizzare: ");
c=getchar();
printf("Inserisci il lato del quadrato: ");
scanf("%d", &side);
for (i=0; i<(side*side); i++)
{
if(i%side==0)
printf("\n");
printf("%c",c);
}
printf("\n\n");
return 0;
}
Ora mi segno giusto questo appunto sul libro
Comunque in pratica ho capito, ma in teoria, cosa significa:
fare il flush dello stdin
?
Re: [C] - Creare quadrato con caratteri
Inviato: dom 19 lug 2009, 3:35
da targzeta
In parole povere vuol dire ripulirlo dalle schifezze. Il problema è che la prima scanf si legge solo il numero che gli hai inserito, ad esempio 5. Ma tu con la tastiera hai premuto due tasti il 5 e l'enter, ovvero '5\n' la scanf non elimina il '\n' dallo standard input (stdin) che quindi rimane lì. La seconda scanf non si mette neanche ad aspettare niente dallo stdin perchè trova il \'n'.
Non so, non vorrei confonderti oltre

. In pratica la scanf blocca il terminale perchè si mette a leggere sullo stdin che è vuoto, ma se questo è pieno non si mette ad aspettare, lo legge.
Un altro esempio per capire meglio (sempre esempi delle 3:00 di notte) è quello di eseguire il tuo codice originale, ma alla prima domanda, invece di rispondere solo con il numero, rispondi anche con un carattere, ad esempio inserisci '5d' e vedrai che lui ti fa una matrice 5x5 di caratteri 'd'.
Notte e in bocca al lupo

,
Emanuele
Re: [C] - Creare quadrato con caratteri
Inviato: dom 19 lug 2009, 3:58
da SIV
Re: [C] - Creare quadrato con caratteri - [RISOLTO]
Inviato: dom 19 lug 2009, 12:41
da metrofox
Ste cose servono anche a me, grazie
