Newsgroup: it.comp.lang.c
Titolo: scherzi del C o problemi dovuti al caldo...HLP

Ciao...
ho un piccolo (strano, infido  e bastardo) problema con questo programma
(vedi fine messaggio).
Il progro è molto semplice. Vengono chieste le dimensioni (riga x colonne)
di un rettangolo, i  caratteri di cornice e di sfondo e poi viene stampato a
video.
Tutto funziona, tranne una cosa.
Quando viene chiesto il carattere che rappresenta la cornice (prima freccia,
vedi listato), dopo che l'utente lo ha immesso esso viene correttamente
memorizzato nella variabile cornice. Poi viene chiesto il carattere che
rappresenta lo sfondo, l'utente lo immette, esso viene memorizzato e, fatto
stranissimo e inspiegabile (almeno per me), il carattere memorizzato nella
variabile cornice si trasforma in "\000". Questa è la cronologia esatta
della comparsa del problema (controllato con il DEBUG).
E' un problema mio o .... boh... non ci capisco niente...
sarà che stamane ho lavorato sotto il sole (come manovale tra () ) e il
caldo ha danneggiato qualche migliaio di sinapsi del mio cervello...
Spero che voi sappiate risolvere il problema...
...Grazie...
CIAO...
----------------------------------------------------
#include <stdio.h>
main()
{
 int n_col,n_row,j,i;
 char cornice,sfondo;
 printf("\nNumero colonne (max 80)-->\t");
 do
   scanf("%d",&n_col);
 while(n_col>80 || n_col<1);
 printf("Numero righe (max 25)-->\t");
 do
   scanf("%d",&n_row);
 while(n_row>25 || n_row<1);
 printf("Carattere cornice: ");            <---
 scanf("%1s",&cornice);
 printf("Carattere sfondo: ");
 scanf("%1s",&sfondo);                   <---
printf("\n");
for(i=1; i<=n_row; i++)
   for(j=1; j<=n_col; j++)
      {
       if(i==1 || i==n_row || j==1 || j==n_col)
         {
          printf("%c",cornice);
          if(j==n_col)
            printf("\n");
         }
       else
         printf("%c",sfondo);
      }
}
------------------------------------------------------------------

 scanf("%1s",&sfondo);                   <---
La cosa  non e`  affatto "inspiegabile": il  compilatore ha  disposto le
variabili in memoria in modo  che /sfondo/ sia immediatamente precedente
a /cornice/.
Tu  indichi a  scanf di  leggere una  stringa composta  da (al  massimo)
un  carattere. Una  tale stringa  richiede  pero`  *2* char  per  essere
memorizzata: uno per il carattere, uno per il terminatore '\0'.
Quello che accade e` che la seconda lettura memorizza il primo carattere
nella variabile  /sfondo/, mentre  il secondo ('\0')  va a  finire nella
locazione  di  memoria  successiva,  dove, *casualmente*,  si  trova  la
variabile /cornice/.
Per leggere le due variabili dovresti fare cosi`:
printf("Carattere cornice: ");
cornice = getchar();
while(getchar() != '\n')
        ;
printf("Carattere sfondo: ");
sfondo = getchar();
while(getchar() != '\n')
        ;
I due cicli servono per eliminare dal buffer tutti i caratteri rimanenti
(tipicamente solo il '\n'). No, non puoi scrivere fflush(stdin).
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Sono un mirabile incrocio tra Tarzan e Giacomo Leopardi.
In me convivono tutte le doti intelluttuali di Tarzan e
tutta la prestanza fisica di Giacomo Leopardi.
A. Borsani

(tipicamente solo il '\n'). 
attenzione perche' while (getchar() != '\n') va inserito anche prima
di printf("Carattere cornice: ") !!
-- 
Ciao, Giuseppe

 scanf("%1s",&sfondo);
idem.
Maurizio.

wow...
...grazie a tutti e due...

grazie...
ciao...