Newsgroup: it.comp.lang.c
Titolo: scanf mi fa impazzire

Salve a tutti,
questo č il mio problema:
#include <stdio.h>
int main()
{
  MSG m, funct();
 
  s = funct();
  printf("login:%s\n", s.login);
 
  return 0;
}
MSG funct()
{
  MSG d;
  scanf("%s", d.login);
 
  return d;
}
typedef struct {
     char *login;
}MSG;
...in compilazione tutto ok ma a runtime "Bus Error".Perchč? 
Qualcuno puň aiutarmi? vi prego ci sto impazzendo!

 }MSG;
Ti riscrivo il programma usando scanf, ma se cerchi sul ng troverai un
sacco di motivi per *non* usare scanf.
#include <stdio.h>
#define MAX_LOGIN_LEN 20
typedef struct {
        /* Spazio per una stringa di MAX_LOGIN_LEN caratteri
         * (piu` il terminatore)
         */
        char login[MAX_LOGIN_LEN];
} MSG;
MSG funct(void);
int main(void) {
        MSG s;
        s = funct();
        printf("login: %s\n", s.login);
        return 0;
}
MSG funct(void) {
        MSG d;
        scanf("%s", d.login);
        return d;
}
Un ultimo consiglio: evita i typedef a meno che non siano veramente
necessari.
Luca
-- 
Home: 
http://kronoz.cjb.net
"L'ottimista pensa che questo sia il migliore dei mondi possibili. 
 Il pessimista sa che e` vero" -- J. Robert Oppenheimer

 wrote in message news:<cu5v6u$i8p$1...@dreamland.darkstar.lan>...

grazie....e se io volessi fare un assegnamento in funct? cioè una cosa del tipo
d.login = "CIAO"; perchè mi dice che il tipo non è compatibile?

 del tipo d.login = "CIAO"; perchè mi dice che il tipo non è compatibile?
Perché in C il tipo "stringa" non esiste. Le stringhe sono implementate
come array di piccoli numeri interi che si chiamano "char". Per copiare
una stringa in un'altra si usa questa scomoda espressione:
    strcpy(d.login, "CIAO");
O meglio ancora, se si conosce la dimensione di d.login:
    strncpy(d.login, "CIAO", dimensione_di_dlogin);
--
Cingar
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Per quale ragione?
Un typedef per risparmiare la scrittura di "struct" peggiora (IMHO) la
leggibilita` del codice. Un typedef per rendere opaco un certo tipo puo`
avere senso.
Luca
-- 
Home: 
http://kronoz.cjb.net
Do, or do not. There is no try.

 avere senso.
Opaco?????
A te non piaceranno le typedef ma che rendano meno leggibile il codice 
e` proprio solo una tua opinione.
typedef struct msg_s MSG;
struct msg_s *msgP;
MSG *msgP;
Queste dichiarazioni sono equivalenti.  Cosa perde in chiarezza la 
seconda?


 seconda?
Nel primo caso so che sto trattando una struttura. Nel secondo caso
potrebbe essere una struct, una union, un tipo primitivo; la variabile
potrebbe essere un puntatore a MSG, un puntatore a puntatore a MSG, un
puntatore a puntatore a puntatore a MSG, ecc. Semplicemente si
nascondondo della informazioni al programmatore; in alcuni casi (molto
pochi) potrebbe essere la cosa giusta da fare, ma piu` spesso non lo e`.
Su, entra nel killfile.
^K
-- 
Home: 
http://kronoz.cjb.net
The trouble with computers is that they do what you tell them, 
not what you want.
D. Cohen

 ^K
Allora cerca di dare consigli pertinenti, senza tirare in ballo cose che 
ad un principiante possono anche non dire niente.


 Opaco?????
Sě, opaco.  Spero che tu sappia che significa passare un parametro "opaco"
a una funzione.


 ad un principiante possono anche non dire niente.
Il consiglio di Kronos era pertinentissimo (come sempre).


 a una funzione.
No!  In italiano non mi dice niente.  Forse se mi dici da quale termine 
inglese e` tradotto ...  Per mia sfortuna non ho mai fatto pratica su 
libri in italiano.


 libri in italiano.
Neanche io.
Il termine inglese è "opaque", che non è molto diverso.


 Il termine inglese è "opaque", che non è molto diverso.
Anche io so tradurre opaco in "opaque", ma francamente non ricordo di 
aver mai sentito o letto una simile definizione nella letteratura a cui 
ho avuto accesso.


 ho avuto accesso.
Non è un problema, il fatto che tu non ne abbia mai sentito parlare, non
vuol dire che gli altri sappiano bene che cos'è.  Hai sempre tempo per
imparare.


 imparare.
Il solito sapientone che ha scritto 2 righe di codice e pensa gia` di 
insegnarlo agli altri.


 insegnarlo agli altri.
Suppongo che invece tu sia il solito *coglione* che ha *letto* due righe
di codice e pensa di insegnarlo agli altri.


 
Bene!  Adesso che ti sei presentato come il solito maleducato, sei 
capace di rispondere alle domande in modo coerente?


 Bene!  Adesso che ti sei presentato come il solito maleducato
Troppo facile dare del maleducato a chi viene provocato.
Taci, farai miglior figura.
