Io inserisco una stringa di caratteri che possono essere maiuscoli o minuscoli e deve restituirmi una seconda stringa con tt caratteri minuscoli tranne la prima lettera di ogni parola, in linguaggio c non usando le funzioni di libreria. Come posso fare? grazie mille ciao
Copyright © 2024 QUIZSILO.COM - All rights reserved.
Answers & Comments
Verified answer
sempre usanto tolower in ctype.h (cfr anche l'altra risposta)... ma se non devi usare funz di libreria.... le reimplementi... :D
puoi guardare le implementazioni come
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc...
e farti ispirare, ma capisco che sono un po' complicate...
la seguente soluzione potrebbe andare (non l'ho controllata)...
#include <stdbool.h>
char *s = ...; // la stringa
size_t l = strlen(s);
int i; int stato = true;
for(i = 0; i < l; i++)
{
if ( s[i] != ' ' && s[i] != '\t' ) { stato = true; continue; }
if ( stato )
{
s[i] = toupper(s[i]); stato = false;
} else {
s[i] = tolower(s[i]);
}
}
le funzioni tolower e toupper semplificate ovviamente... (quelle di libreria funzionano meglio... :D)
int tolower(int c)
{
if ( c >= 'A' && c <= 'Z' ) return c + ('a' - 'A');
return c;
}
int toupper(int c)
{ if ( c >= 'a' && c <= 'z' ) return c + ('A' - 'a');
return c;
}
l'idea del codice è usare intanto un flag di stato. se questo è vero, vuol dire che siamo in attesa di una nuova parola, che inizia dopo spazio o tab (dunque "ciao-bao" è considerata una parola unica così come "ciao,bao", ma basta che aggiungi altri && simili a quelli che ci sono per aumentare il numero di separatori... considerando che se si scrive correttamente dopo la punteggiatura ci va uno spazio no dovrebbe essere un problema)
dunque se siamo nello stato di attesa parola e incontriamo qualcosa che non è uno spazio o un tab, il continue non viene eseguito e quello che facciamo dopo è: se stato è vero (inizio di parola) mettiamo la lettera maiuscola e poi cambiamo stato (il successivo carattere è in mezzo alla parola o un separatore), se è falso (in mezzo a una parola) rendiamo il carattere minuscolo e proseguiamo, rimanendo nello stato "falso" (in mezzo alla parola) finché non incontriamo un separatore, che ci fa tornare allo stato vero (cioè arriverà, dopo il separatore e sue ripetizioni, l'inizio di una nuova parola)
In codice ASCII la "A" è 65 e la "a" è 97 quindi per convertire una lettera da maiuscola a minuscola basta sommargli 32 al suo codice ASCII. Il resto te lo lascio per esercizio.
esistono funzioni che fanno questa cosa...ti do un consiglio sulle operazioni da fare
carattere iniziale= sottostringa(stringa in ingresso,inizio 0, lunghezza1)
parola minuscola = tutto minuscolo(stringa in ingresso)
frase-1= sottostringa(parola minuscola, inizio 1, lunghezza(parola minuscola))
frase finale concateni carattere maiuscolo e frase-1