Newsgroup: it.comp.os.linux.development
Titolo: Aiuto esercizio in C

Un saluto al NG, vi posto il listato che mi sta faccendo dannare:
#include <stdio.h>
int main(int argc, char *argv[]){
        int i, n;
        FILE *fp;
        char *fn = argv[1];
        char *buff;
        char *s;
        char *end = "\n";
        // Prima controllo se c'è il file di output
        if (argc == 2){
                printf("File di output: %s\n",fn);
                printf("Quanti numeri vuoi inserire? ");
                scanf("%d",&n);
 
                //apriamo il file,
                fp = fopen(fn,"w");
 
                if (fp != NULL){
                        // adesso dovrebbe ciclare un numero n di volte per farmi
                        // acquisire i valori
                        for (i = 0; i < n; i++){
                                printf("Inseisci un numero: ");
                                //scanf("%s",s);        <-- o l'una o l'altra
                                gets(s);                <-- mi danno seg fault
                                // a questo punto preparo un buffer, gli appendo un \n
                                buff = strcat(s,end);
                                // e lo scrivo nel file
                                fputs(buff, fp);
                        }
                        fclose(fp);
                }else{
                        printf("Errore apertura %s\n",fn);
                }
        }
        else{
                return(-1);
        }
}
Il problema è che 3 volte su 4 ottengo un segmentation fault. Dove sbaglio?
Grazie.
        by E'S
P.S. Ammetto che di C so poco o nulla ma devo impararlo per scopi didattici.

 didattici.
Impara anche ad usare gdb
€ gdb Aiuto_esercizio_in_C 
GNU gdb 6.1-debian
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you
are welcome to change it and/or distribute copies of it under certain
conditions. Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for
details. This GDB was configured as "powerpc-linux"...Using host
libthread_db library "/lib/libthread_db.so.1".
(gdb) run l
Starting program: /home/raf/Aiuto_esercizio_in_C l
File di output: l
Quanti numeri vuoi inserire? 3
Program received signal SIGSEGV, Segmentation fault.
0x0ff097a0 in gets () from /lib/libc.so.6
(gdb) bt
#0  0x0ff097a0 in gets () from /lib/libc.so.6
#1  0x0ff09810 in gets () from /lib/libc.so.6
#2  0x0febf100 in __libc_start_main () from /lib/libc.so.6
Ok, vedi che c'e' un errore in gets[2]. Sei sicuro che sia corretto?
da man gets
SYNOPSIS
       #include <stdio.h>
       char *gets(char *s);
DESCRIPTION
       gets() reads a line from stdin into the buffer pointed to  by  s 
until       either  a  terminating newline or EOF, which it replaces
with '\0'.  No       check for buffer overrun is performed (see BUGS
below).
e vedi che gets vuole un array di char (char* o char[]), cosa che nel
tuo programma non passi. Sostituisci
char *s
con
char s[1024]; /*un po di spazio sobrabbondante*/
a questo punto hai dato al programma un posto dove mettere i caratteri
recuperati da tastiera. Ci sono molti modi per farlo.
C'e' anche un altro errore: non richiede il primo valore, ma passa
subito al secondo. Lascio a te/agli altri la correzione ;)
[1] anche a chi lurka
[2] ok, lo sapevi gia', ma e' un caso ;), io generalizzo
-- 
()_() | Always keep the Titanic in mind when I talk about  | +----
(°.°) | security or safety, meaning that nothin is         | +---+
'm m' | fully secure.                                      |  O  |
(___) |              raffaele punto salmaso presso libero punto it
GPG fingerprint 1CF5 51D4 E528 EB87 9977  B277 BE8C BF1E 620C 40ED

                                 gets(s);                <-- mi danno seg fault
se usi gcc, ti viene dato un warning sull'uso di gets(). Dacci
un'occhiata a quel warning e poi passa a fgets() che e' decisamente
piu' sicura.
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Grazie per le risposte, ho finalmente compreso l'errore! Pensavo,
erroneamente, che in scanf("%s",s) o gets(s) l'imput da tastiera fosse già
bufferizzato da qualche parte...invece no.
Vabbuò, grazie mille e d'ora innanzi vedrò di postare sul NG giusto, come
suggeritomi.
Grazie ancora.
        by E'S