[C] suddivisione di una stringa in sottostringhe

Messaggioda Suwako27 » 16/06/2020, 22:08

Salve, questa volta ho un esercizio su stringhe che chiede: "data una stringa di caratteri dall’alfabeto
italiano compreso di spazi nella variabile *testo , restituisca in un vettore
di stringhe tutte le sottostringhe di *testo terminanti con la varibile c .
Ad esempio dato testo = "viva la mamma ed il papa" e c = ’a’ restituisca il
vettore "viva"," la","ma","mma","ed il pa","pa" ". Ho visto che problemi di questo tipo esiste appositamente la funzione strtok della string.h che, per a quanto ho capito, divide la stessa stringa di partenza inserendo un '\0' ogni volta che viene incontrato un carattere di delimitazione. Quindi i dubbi sono: ci sono altri modi per risolvere l'esercizio? se si, come faccio per il carattere di delimitazione? (che NON è 'a' poiché dovrebbe comunque essere inserito all'interno delle stringhe) So che dovrei scrivere già qualcosa, ma preferirei cominciare a capire queste cose prima di poter scrivere qualcosa. Grazie in anticipo per l'aiuto.
Suwako27
New Member
New Member
 
Messaggio: 14 di 74
Iscritto il: 01/03/2020, 18:55

Re: [C] suddivisione di una stringa in sottostringhe

Messaggioda apatriarca » 17/06/2020, 00:38

Siccome è un esercizio credo che il metodo da utilizzare sia quello di fare una ricerca attraverso la stringa e allocare una nuova stringa ogni volta che si incontra il carattere memorizzato nella variabile c.

Come hai già osservato strtok non può essere usato nel tuo caso perché ha un comportamento invalido. Le funzioni di ricerca (strchr in particolare) possono invece essere usate senza problemi. Tuttavia credo sia più istruttivo scrivere tutto tu.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5442 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [C] suddivisione di una stringa in sottostringhe

Messaggioda Suwako27 » 17/06/2020, 09:23

ma per fare una cosa del genere non dovrei comunque allocare prima spazio per un array di stringhe?
Codice:
...
   char* p = testo;
   
   while(*p != '\0')
   {
      if(*p == c)
         counter++;
      p++;
   }
   char** s = malloc(counter*sizeof(char*));

Ho anche visto che la strchr restituisce un puntatore all'elemento della stringa contenente il carattere cercato, facendo una cosa del genere( giusto per capire come funziona)
Codice:
while(*testo != '\0')
   {
      testo = strchr(testo, c);
      putchar(*testo);
      testo++;
   }

riesco a trovare le ultime lettere di ogni sottostringa da inserire in s. Quindi, siccome devo fare la copia di una parte di testo , posso usare la strncpy, dove il numero di caratteri lo ottengo contando tutti gli elementi di testo fino al primo char c.
p.s. chiedo scusa magari per chiedere tutte queste cose senza aver prima scritto il codice, però studiando solo vorrei prima capire bene gli argomenti e senza magari copiare a macchinetta codici senza comprenderne la natura(soprattutto i puntatori e la gestione della memoria che mi fanno ancora "laggare" la mente)
Suwako27
New Member
New Member
 
Messaggio: 15 di 74
Iscritto il: 01/03/2020, 18:55

Re: [C] suddivisione di una stringa in sottostringhe

Messaggioda apatriarca » 17/06/2020, 10:02

Devi certamente allocare anche la memoria per l'array di stringhe. A scelta puoi ridimensionare tale array nel ciclo o calcolare questa dimensione in un primo ciclo e allocare e copiare le stringhe in un secondo.

Sull'uso di strchr devi poi considerare anche la parte finale della stringa. L'ultima stringa sarà infatti di solito compresa tra l'ultima occorrenza del carattere e il terminatore di stringa. Ti consiglio inoltre di usare una variabile temporanea aggiuntiva al posto di testo. Infine userei memcpy invece di strncpy perché la stringa sarà sempre più lunga di quel numero di caratteri.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5444 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [C] suddivisione di una stringa in sottostringhe

Messaggioda Suwako27 » 17/06/2020, 20:18

Questo mi da l'output corretto:
Codice:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>


int main(void)
{
   char* testo = "viva la mamma ed il papa";
   
   char* p = testo;
   char c;
   unsigned int dimensione, counter = 0;
   scanf("%c", &c);
   while(*p != '\0')
   {
      if(*p == c)
         counter++;
      p++;
   }
   
   char** s = malloc(counter*sizeof(char*));
   p = testo;
   for( unsigned int i = 0; i < counter; i++)
   {
      p = strchr(testo, c);   
     int n = ((p + 1) - testo);
   //printf("%d\n", n);
   s[i] = malloc(( n + 1)*sizeof(char));
    memcpy(s[i], testo, n);
   *(s[i]+n) = '\0';
   testo = p + 1;
    p++;   
   printf("|%s|", s[i]);
   
      
   }
   
}
Suwako27
New Member
New Member
 
Messaggio: 16 di 74
Iscritto il: 01/03/2020, 18:55

Re: [C] suddivisione di una stringa in sottostringhe

Messaggioda vict85 » 18/06/2020, 08:44

Sinceramente immaginavo che dovessi scrivere una funzione. In ogni caso è buona norma deallocare la memoria.
vict85
Moderatore
Moderatore
 
Messaggio: 10143 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: [C] suddivisione di una stringa in sottostringhe

Messaggioda Suwako27 » 18/06/2020, 09:14

L'esercizio chiedeva soltanto di costruire un programma che faccia queste operazioni, ma ovviamente sarebbe preferibile farlo per renderlo più leggibile. Invece per la liberazione della memoria , per farlo correttamente, non bisognerebbe scrivere una funzione che scorre e usare free per le varie sotto stringhe di s e poi farlo su s stesso?
Suwako27
New Member
New Member
 
Messaggio: 17 di 74
Iscritto il: 01/03/2020, 18:55

Re: [C] suddivisione di una stringa in sottostringhe

Messaggioda Suwako27 » 18/06/2020, 12:40

Dovrebbe essere una cosa del genere:
Codice:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int contaStringhe( char* t, char* p, char c)
{
   unsigned int counter = 0;
   while(*p != '\0')
   {
      if(*p == c)
         counter++;
      p++;
   }
   p = t;
   return counter;
}

void sottostringhe(char* t, char* p, char c, unsigned int counter)
{
   char** s = malloc(counter*sizeof(char*));
   for( unsigned int i = 0; i < counter; i++)
   {
           p = strchr(t, c);   
       int n = ((p + 1) - t);
        s[i] = malloc(( n + 1)*sizeof(char));
    memcpy(s[i], t, n);
   *(s[i]+n) = '\0';
       t = p + 1;
     p++;   
    printf("|%s|", s[i]);
    free(s[i]);
   }
   free(s);
}

int main(void)
{
   char* testo = "viva la mamma ed il papa";
   
   char* p = testo;
   char c;   
   scanf("%c", &c);   
   unsigned int counter = contaStringhe(testo, p, c);
   sottostringhe(testo, p, c, counter);
}
Suwako27
New Member
New Member
 
Messaggio: 18 di 74
Iscritto il: 01/03/2020, 18:55


Torna a Informatica

Chi c’è in linea

Visitano il forum: Google [Bot] e 1 ospite