View Full Version : [C] esercizio facile...
Si definisca una funzione di char * che accetti come parametro una stringa e restituisca una diversa stringa con tutti i caratteri alfabetici passati al caso maiuscolo e gli altri caratteri inalterati. La stringa originale non deve essere cambiata.
'A' in ascii è 65
'a' invece 97
quindi 97-65=32
prendo la stringa e sottraggo -32 su ogni carattere, giusto??
Si definisca una funzione di char * che accetti come parametro una stringa e restituisca una diversa stringa con tutti i caratteri alfabetici passati al caso maiuscolo e gli altri caratteri inalterati. La stringa originale non deve essere cambiata.
'A' in ascii è 65
'a' invece 97
quindi 97-65=32
prendo la stringa e sottraggo -32 su ogni carattere, giusto??
E se il carattere è già una lettera maiuscola cosa succede col tuo metodo?
Fede_Reghe
18-03-2007, 17:09
ricordati di trasformarle in int prima di sottrarre!
ricordati di trasformarle in int prima di sottrarre!
ah! ...help me:muro: :mc:
Fai un controllo.
Qui trovi la tabella ascii
http://www.asciitable.com/
Se è tra 97 e 122 (ovvero se è una minuscola) sottrai 32, altrimenti lasci il valore attuale.
ricordati di trasformarle in int prima di sottrarre!
il C memorizza i char direttamente con il loro codice ASCII, quindi non dovresti avere problemi di conversione.
Fede_Reghe
18-03-2007, 17:25
Eventualmente se non te lo converte fai risultato[1] = (int) arr[1] - 32;
ho qualche problema.... :muro: :muro:
void cambia (char* c) {
char *T;
....????
T[i]=(int) c-32;
printf("%s ", c);
}
int main() {
char* c= "ciao";
printf("%s \n",c);
cambia(c)
return 0;
}
ho qualche problema.... :muro: :muro:
void cambia (char* c) {
char *T;
....????
T[i]=(int) c-32;
printf("%s ", c);
}
int main() {
char* c= "ciao";
printf("%s \n",c);
cambia(c)
return 0;
}
il vettore su cui devi lavorare è quello che passi in ingresso.
Quindi char T* è inutile.
poi fai un ciclo con cui controlli se la stringa è terminata (da 0).
int i=0;
while(c[i]!='\0'){
if(c[i]>=97&&c[i]<=92){
c[i]=c[i]-32;
}
i++;
}
mia versione:
char *Capitalize(char *Input)
{
char *Output;
int i;
Output = (char*)malloc(strlen(Input) + 1); /* occhio al leak */
for (i = 0; Input[i]; i++)
{
if ((Input[i] >= 'a') && (Input[i] <= 'z'))
{
Output[i] = Input[i] + 'A' - 'a';
}
else
{
Output[i] = Input[i];
}
}
return Output;
}
mi dà un error (bus error)....
void cambia (char* c) {
int i=0;
while(c[i]!='\0'){
if(c[i]>=97 && c[i]<=122){
c[i]=c[i]-32;
}
i++;
}
printf("%s ", c);
}
int main() {
char* c= "ciao";
printf("%s \n",c);
cambia(c);
return 0;
}
mi dà un error (bus error).... perché hai provato a modificare un'area di memoria che la maggioranza dei compilatori nella maggiornaza dei casi imposta a sola lettura, ovvero la stringa "ciao". usa la malloc e risolvi il problema (oltre che rispettare le specifiche ;)).
sottovento
19-03-2007, 02:45
Non ho capito: e' vietato usare il toupper() ?
Usandolo e' tutto facile:
char *toUpperCase (char *strin)
{
char *strout;
char *p, *q;
strout = (char *)malloc (strlen(strin) + 1);
if (!strout)
return NULL; // Cannot allocate memory
q = strin;
p= strout;
while ((*p++ = toupper(*q++)));
return strout;
}
OT
IMHO è molto brutto allocare così...l'utilizzatore della vostra funzione sicuramente si scorderà di deallocare la stringa ;)
In questo caso: o si lascia costruire al chiamante il buffer di output o si sovrascrive la stringa corrente
Concordo che ci sono casi in cui è impossibile attuare la prima politica, ma questo è uno dei tanti in cui non conviene allocare dinamicamente all'insaputa dell'utente.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.