Questa è la consegna dell'esercizio:
La funzione accetta una stringa C (zero terminata) e ritorna una stringa C allocata dinamicamente sull’heap, contenente tutti i caratteri della stringa s presi una sola volta, nell’ordine con cui appaiono in s.
Ad esempio data la stringa s=“ciao casa”, la funzione deve ritornare “ciao s”. Infatti, scorrendo s, incontriamo prima ‘c’, poi ‘i’, poi ‘a’, poi ‘o’, poi ‘’. Nessuno di questi è già stato visto. Poi incontriamo ‘c’, ma questo carattere è già stato incontrato e quindi non viene concatenato alla stringa di ritorno. Lo stesso succede per ‘a’, poi si incontra ‘s’ e viene mandato in output. Infine troviamo ancora ‘a’ e di nuovo lo ignoriamo.
Il puntatore ritornato deve puntare ad un’area di memoria grande esattamente il numero di byte necessari a contenere i caratteri unici e il terminatore. s non sarà mai NULL.
questo è il mio main
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
extern char *unici(const char *s);
int main(){
char str[] = "ciao casa";
char ris = unici(str);
return 0;
}
questo è il mio file.c
#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
char *unici(const char *s){
size_t lunghezza = strlen(s);
size_t doppioni = 0;
size_t i = 0;
size_t k;
for (i = 0; i < strlen(s); i++){
k = i + 1;
while (s[k] != '\0'){
if (s[i] == s[k]){
doppioni++;
break;
}
k++;
}
}
size_t strnew = strlen(s) - doppioni;
char *ris = malloc((strnew + 1) * sizeof(char));
size_t j = 0;
size_t f = 0; // indice nuova stringa
for (i = 0; i < strlen(s); i++){
k = i + 1;
while (s[k] != '\0'){
if (s[i] == s[k]){
break;
}
k++;
}
ris[f] = s[i];
f++;
}
ris[strnew] = "\0";
return ris;
}
Premetto che il mio programma non funziona come dovrebbe. Una prima parte sembrerebbe corretta, perchè tramite la variabile 'doppioni' scarto le lettere in più, cosi da allocare la giusta dimensione di memoria tramite la malloc. Però poi quando devo allocare i caratteri della stringa non riesco a capire come dovrei fare.. ho cercato di provare un doppio ciclo, ma con scarsi risultati
Qualcuno riesce a darmi una mano?