Newsgroup: it.comp.lang.c
Titolo: Somma di char

Ho un problema io ho queste char
char frase[128]
int d
a[128] e
char b di cui non posso specificare la lunghezza perchè se no mi genera
un'errore quando faccio una cosa del tipo b=frase[d] e voglio sommare alla
stringa a il valore di b ad esempio con strcat(a,b) ma ciò mi genera un
errore e se gli dò una lunghezza l'errore lo fa con b=frase[d] io ho provato
a dargli prima un valore e poi fare (char)b ma l'errore lo fa lo stesso.
Riassumendo come faccio a evitare uno dei due errori?
Grazie

 wrote in message
NtYQ3.2801$yQ.3...@typhoon.libero.it...


 wrote in message
7v1ovq$1pnm$1...@stargate1.inet.it...


a dargli prima un valore e poi fare (char)b ma l'errore lo fa lo stesso.
Dunque, io credo di aver "intravisto" quale sia il problema, ma non
sono totalmente sicuro.
Sei poco chiaro nello specificare i dati, suppongo che siano :
char frase[128] ;
int d ;
char a[128] ;
char b ;
Il problema dovrebbe consistere nell'incapacità di "sommare" b ad a,
cioè ad aggiungerlo a fine stringa.
strcat() lavora solo su (char *) e non sul carattere singolo, anche
perchè ha bisogno di sapere dove termina la sequenza di caratteri da
addizionare.
Per aggiungere un carattere c alla stringa s, puoi usare un metodo
molto semplice : 
l = strlen( s ) ;
s[l] = c ;
s[l+1] = '\0' ;
--
Andrea Laforgia        (
andrea_...@bigfoot.com
)

 Riassumendo come faccio a evitare uno dei due errori?
Il tuo problema č che non conosci la differenza che passa tra il dichiarare
una variabile
char b;
e un vettore di variabili
char b[80];
Ripassa meglio l'argomento (non č una critica, č solo un consiglio).
Ciao, Giuseppe
---------------------------------------------------------------------------
_Guybrush su IRCNet canale #programmazione
ICQ: 42227764
---------------------------------------------------------------------------

 
"Poco chiaro"?!?!?! E' un gentile eufemismo ;-)
Io non ci ho capito un tubo.
-- 
 Ciao, Luca.
 Reply to 
luca....@tiscalinet.it

Riassumendo come faccio a evitare uno dei due errori?
con
b=frase[d];
a[strlen(a)] = b;
a[strlen(a)] = 0;

 char frase[128] ;


 }
Per il secondo frammento di codice vale pressappoco lo stesso discorso
Spero di non aver detto strafalcionate sennň Andrea mi bacchetta :o))

        sprintf (s, "%s%c", s, c);
Temo che sprintf() sia un pò troppo pesante e lenta e, a dire la
verità, anche poco efficiente in questo caso, in quanto gran parte del
tempo lo impiega per spostare dei caratteri in una posizione in cui ci
sono già ! (mi riferisco alla copia di gran parte di s su se stessa)
Invece un metodo molto più veloce è quello di utilizzare una variabile
locale statica nel modo seguente :
#include <stdio.h>
#include <string.h>
typedef enum { ADD, RESET } op_t ;
/* specifica il tipo di operazione che si compie sulla
   stringa, cioè se si compie una ulteriore addizione, 
   o se si compie la prima addizione. */
void addchar ( char * s, char c, op_t op )
{
     static unsigned l ;
     if ( op == RESET )
        l = strlen( s ) ;
     s[l] = c ;
     s[l+1] = '\0' ;
     l++ ;
}
main()
{
    char s [10] = "andrea" ;
    char t [20] = "pippo" ;
    addchar( s, 'X', RESET ) ;
    addchar( s, 'Y', ADD ) ;
    addchar( s, 'Z', ADD ) ;
    addchar( t, 'I', RESET ) ;
    addchar( t, 'J', ADD ) ;
    addchar( t, 'K', ADD ) ;
    puts( s ) ;
    puts( t ) ;
}
--
Andrea Laforgia        (
andrea_...@bigfoot.com
)

char [] = char*
Accidenti ! e dire che eri andato cosě bene ! ;)
--
Andrea Laforgia        (
andrea_...@bigfoot.com
)

 a[strlen(a)] = 0;
a questo punto la nuova valutazione di strlen(a) chissà cosa da?
(dipende da dove trova in memoria il successivo carattere tappo '\0')
nel peggiore dei casi avrai un "memory dump"
funzionas invece così:
b=frase[d];
len = strlen(a);
a[len] = b;
a[len+1] = 0;
Vero Andrea? ;o))
-- 
- Che cosa vuol dire "addomesticare"?
- E' una cosa da molto dimenticata. Vuol dire "creare dei legami"
		Antoine de Saint-Exupéry - Il piccolo principe

Giusto.
Marco\0

        sprintf (s, "%s%c", s, c);
Piu' volte in passato ho provato a fare una cosa del genere ed ho
sempre visto che, anche se l'istruzione e' corretta e il compilatore
la compila, il risultato e' incerto e il problema e' dovuto al fatto
che la variabile usata per ricevere l'output di sprintf ( s ) viene
usata anche come argomento.
Infatti l'output a video (compilato con Borland TC++ 3.0) del seguente
esempio e' : ABCDEFGH
#include <stdio.h>
int main(void)
    {
    char s1[80]="abcdefgh";
    char s2[80]="ABCDEFGH";
    sprintf(s1, "%s%s", s1, s2);
    printf("\n\n%s", s1);
    return 0;
    }
Sarei curioso di sapere cosa dice lo standard a proposito.
ciao

Sarei curioso di sapere cosa dice lo standard a proposito.
Lo standard giudica, attribuendo un comportamento "undefined", quelle
espressioni in cui si modifica una variabile e nel contempo si accede
ad essa, laddove non sia esplicitamente specificata quale sia la
precedenza tra le operazioni.
--
Andrea Laforgia        (
andrea_...@bigfoot.com
)