Newsgroup: it.comp.lang.c
Titolo: funzione per maiuscole

ho provato a creare questa funzione per convertire in maiuscolo una stringa
(probabilmente esistera' gia', ma per me e' un ottimo esercizio pratico...)
ma sicuramente c'e' piu' di un errore...
chi puo' darmi una mano???
ciao e grazie in anticipo!!!
char *maiuscolo(char *stringa)
{
        /* converte in maiuscolo una stringa */
	char *fstring(char*)malloc(strlen(stringa)+1);
	while(*fstring++  (char)toupper (*stringa++))
	;
	fstring[strlen(stringa)+1]'\0';
	return fstring;
}
__________________________________________________________________
Abbonati a Tiscali!
Con VoceViva puoi anche ascoltare ed inviare email al telefono.
Chiama VoceViva all' 892 800        
http://voceviva.tiscali.it
-- 
Posted from 
mail-4.tiscalinet.it
 [195.130.225.150] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 }
Io farei:
char *maiuscolo(char *stringa)
{
        /* converte in maiuscolo una stringa */
        char *fstring=(char*)malloc(strlen(stringa)+1);
        int i=0;
        while(stringa[i])           {
            fstring[i]=(char) toupper (stringa[i]);
            i++;
        }
        fstring[i]='\0';
        return fstring;
}
Il resto dovrebbe andare. Ricordati però che, poichè allochi
dall'interno della funzione della memoria, è necessario che questa venga
assegnata ad una variabile char*, in modo da poterla deallocare
successivamente. Se fai ad esempio:
printf("%s", maiuscolo("prova"));
la memoria allocata non può essere deallocata (almeno per quanto ne so
io). In alternativa potresti fare una procedura che modifichi
direttamente la stringa passata per indirizzo, senza dover richiamare
malloc.
Cecco

ho provato cosi' ed effettivamente va bene ugualmente
void maiuscolo(char *dest, char *src)
{
     while(*dest++ = (char)toupper (*src++));
}
-- 
Posted from  [213.82.129.50] 


 (probabilmente esistera' gia', ma per me e' un ottimo esercizio
pratico...)
si, esiste in alcune implementazioni del C (non standard) strupr o _strupr

}
Il puntatore fstring, viene incrementato, alla fine della funzione
fstring punta al '\0', percio' puoi:
sostituire fstring[strlen(stringa)+1]='\0'; con *fstring = '\0' ma
questo solo per motivi 'estetici'.
Per ovviare all'inconveniente devi salvare fstring prima che venga
modificato, usando un altro puntatore:
char *fstring=(char*)malloc(strlen(stringa)+1);
char *ret;
ret = fstring;
while ...
...
return ret;
ciao, acc.   
a...@libero.it

 modificato, usando un altro puntatore:
cosi' e' la soluzione corretta.
ciao
donCiccio

 donCiccio
-- 
Posted from  [213.82.129.50] 


   anche con ret???
No. Quello  che  succedeva  prima  era   che  il  valore  restituito  da
malloc andava  perso perche`  il puntatore fstring  veniva incrementato.
Risultato: non e` piu` possibile liberare quell'area di memoria; inoltre
il valore ritornato dalla funzione e` sbagliato. Se invece faccio:
char *ret, *fstring;
ret = fstring = malloc(15);
fstring += 10;
free(fstring); 	/* ERRORE! fstring non punta piu` al blocco ottenuto con
		   malloc */
free(ret);	/* Ok, ret non e` stato modificato e fa sempre
		   riferimento al blocco ottenuto con malloc */
Schemino ASCII:
	  	   _
ret, fstring -->  |_|	Questa e` la situazione iniziale: ret e fstring 
		  |_|	puntano al primo elemento di un array dinamico
		  |_|	ottenuto con malloc()
		  |_|
		  |_|
 
		   _
ret          -->  |_|   Questa e` la situazione finale: ret punta ancora
		  |_|   all'inizio dell'array, fstring e` stato spostato.
		  |_|   Occhio che stiamo parlando di puntatori
		  |_|	(indirizzi di memoria), non dei dati contenuti
fstring	     -->  |_|	in quell'area.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Un apostolo vedendo Gesu` camminare sulle acque:
- Cazzo se e` buono 'sto fumo!!!

no punta al carattere seguente
Hai ragione, non avevo notato che il '\0' era gia' copiato, a questo
punto basta toglierlo del tutto.
ciao, acc.   
a...@libero.it