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:

Codice: Seleziona tutto

scanf("\n%c", &c);
Passando anche \n al carattere c :-k

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

Codice: Seleziona tutto

getchar()
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 :thumbright: :thumbright:

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
Capito tutto!

Grazie Emanuele e buona domenica visto che ci siamo :) :) :thumbright: :thumbright: :thumbright:

Re: [C] - Creare quadrato con caratteri - [RISOLTO]

Inviato: dom 19 lug 2009, 12:41
da metrofox
Ste cose servono anche a me, grazie :D