Newsgroup: it.comp.lang.c
Titolo: Problemi con le stringhe

Vorrei sapere se è lecito in c dichiarare una stringa in questa maniera:
#include <stdio.h>
void main (void){
    char * p;
    printf ("Come ti chiami?  ");
    scanf ("%s", *p);
    printf ("Complimenti %s è un bel nome!", *p);
}
Se non è lecitoto accetto suggerimenti
Grazie
Fabio
email: 
em...@mail.dex-net.com

 }
Forse così funziona:
#include <stdio.h>
#define STRING_LENGTH 80
int main()
{
    char * p;
    p = malloc( STRING_LENGTH );
    if ( p == 0 )
    {
        puts( "Memoria insufficiente" );
        return 1;
    }
    printf ("Come ti chiami?  ");
    scanf ("%s", p);
    printf ("Complimenti %s è un bel nome!", p);
    free( p );
    return 0;
}
EMG

Enrico Maria Giordano (
e.m.gi...@flashnet.it
) wrote:
[ snip ]
: #include <stdio.h>
Aggiungi
#include <stdlib.h>
E se vuoi usare fgets() (vedi piu' avanti) anche un
#include <string.h>
: #define STRING_LENGTH 80
: int main()
: {
:     char * p;
Se vuoi usare fgets(), aggiungi
	char *c;  
:     p = malloc( STRING_LENGTH );
:     if ( p == 0 )
:     {
:         puts( "Memoria insufficiente" );
:         return 1;
:     }
:     printf ("Come ti chiami?  ");
:     scanf ("%s", p);
Cosi' rischi un 'buffer overflow': se qualcuno inserisce piu' di 
STRING_LENGTH caratteri, va a scrivere oltre la fine del buffer.
Un modo di evitarlo e' sostituire la scanf() con:
 
	fgets(p, STRING_LENGTH, stdin);
in tal caso, pero', devi togliere l'eventuale '\n' finale:
	if(c = strchr(p, '\n')) *c = '\0';
:     printf ("Complimenti %s è un bel nome!", p);
Qui aggiungerei un '\n' alla fine.
:     free( p );
:     return 0;
: }
Ciao ciao,
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)

    printf ("Complimenti %s h un bel nome!", *p);
Per la stessa ragione che ti ho descritto sopra non puoi scrivere "*p", ma devi
scrivere "p".
Riassumendo, il programma corretto sarebbe :
#include <stdio.h>   /* I/O standard */
#include <stdlib.h>  /* per la funzione "malloc()" */
int main ( void )
{
    char * p ;
    p = malloc ( 51 ) ;  /* 50 + il carattere nullo */    
    if ( p != NULL )  /* controlliamo che "p" sia un indirizzo valido */
    {
       printf("Come ti chiami (max 50 car.) ? ");
       scanf("%s", p);
       printf("Complimenti %s e\' un bel nome !", p);
    }
    else 
    {
       fprintf(stderr, "*** memoria insufficiente ***") ;
       return 1 ;
    }
    free ( p );  /* operazione inversa alla malloc() che rilascia la memoria */
    return 0 ; 
/* main() ritorna 0 che solitamente vuol dire che non c'e' stato alcun errore */
}  
Skyscraper (apprezzatelo adesso : eviterete la coda)
----------------------------------------------------
 
andrea_...@bigfoot.com
----------------------------------------------------
--
Posted from 
itaca.ulysse.it
 [195.223.254.1]
via Mailgate.ORG Server - 
http://www.mailgate.org

 [...]
Tutti i tuoi commenti sono giustissimi.
EMG

 if(c = strchr(p, '\n')) *c = '\0';
Cosa fa la riga precedente? Non capisco...
San Vegeta from Hell
http://www.geocities.com/Area51/Dungeon/8436
http://come.to/Fantasy.it


 Cosa fa la riga precedente? Non capisco...
La funzione strchr() ricerca il carattere '\n' nella stringa p e ne
assegna a c la posizione. Se č zero vuol dire che non l'ha trovato
allora non fa niente. Se č diverso da zero allora l'if riesce e quindi
sostituisce il '\n' con il '\0' ottenendo cosě una normale stringa
ASCIIZ.
EMG