PDA

View Full Version : [C] esercizio facile...


nicod83
18-03-2007, 16:49
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??

Tadde
18-03-2007, 16:58
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!

nicod83
18-03-2007, 17:12
ricordati di trasformarle in int prima di sottrarre!

ah! ...help me:muro: :mc:

wisher
18-03-2007, 17:15
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.

wisher
18-03-2007, 17:16
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;

nicod83
18-03-2007, 18:11
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;
}

wisher
18-03-2007, 18:39
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++;
}

71104
18-03-2007, 19:37
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;
}

nicod83
18-03-2007, 20:22
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;
}

71104
19-03-2007, 01:41
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;
}

cionci
19-03-2007, 08:54
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.