C... Stringhe, stampare solo le parole dispari!

di il
9 risposte

C... Stringhe, stampare solo le parole dispari!

Ciao a tutti,
Vi pongo il mio quesito in Programmazione C.

Letta una stringa ad esempio " Ciao come stai"
mettere in un nuovo vettore e stampare le parole di posto dispari ad esempio ( la prima parola, la terza parola, la quinta e così via), nel caso specifico
"ciao stai".

Possibilmente se è possibile senza usare le funzioni presenti in <string.h>.
vi posto un pezzo del mio codice.....
dopo aver letto la stringa
gets(stringa);
.
.
.

while (stringa !='\0')//terminatore di stringa serve a scorrere tutta la stringa inserita

{

if(stringa!=' ')// confronto per vedere se ci sono spazi vuoti
{

stringa2[j]=stringa; //copio la prima parola nel secondo array

i++;

j++;

} else
{
//dovrei saltare la seconda parola...... ma qui mi sono fermato qualcuno ha qualche suggerimento?
for(i=i+1;stringa!=' ';i++)//l'idea era quella di incrementare l'indice fino alla successiva parola
}

}//chiusura del while
stringa2[j]='\0'; //porre il terminatore all'array creato prima di stamparlo

9 Risposte

  • Re: C... Stringhe, stampare solo le parole dispari!

    Lavora con una variabile che funzioni da flag. Quando è a 1 copi la parola, quando è a 0 non la copi. Il suo valore parte da 1 (per copiare la prima parola) e cambia ad ogni spazio incontrato (a patto che le parole siano separate da un solo spazio)
  • Re: C... Stringhe, stampare solo le parole dispari!

    GRAZIE! per l'aiuto ho risolto utilizzando lo switch case per i due casi,
    caso 0:
    incremento solo l'indice della mia stringa inserita;
    caso 1:
    copio i caratteri della parola nel nuovo array.

    il tuo con utilizzo di una variabile che mi conta le parole e con il modulo2 ricavo la scelta dello switch.

    Se a qualcuno dovesse servire ecco il mio esercizio:

    /* Letta una stringa di N parole, contare da quanti caratteri e quante parole è composta.
    Copiare in un nuovo Array tutte le parole di posto dispari e stampare il nuovo Array.

    Analisi
    --------
    Dopo aver acquisito una stringa la passo in una funziona che con opportuni confronti e condizioni cerco di, le parole dispari
    in una nuova stringa. Per far ciò mi sono servito dello switch case con due possibili casi (0/1) che con l'uso di una variabile
    dichiarata "modulo" effettuo le due scelte dopo aver appunto calcolato il modulo di un contatore che ho usato per contare le
    parole presenti in una stringa.
    caso 0:
    ovvero parola pari, quindi da non copiare nella stringa2, faccio solo l'incremento dell'indice stringa inserita
    caso 1:
    ovvero parola dispari, quindi da copiare in stringa2
    Se consideriamo che le parole vengono identificate dalla presenza di uno spazio, se ad esempio la nostra stringa è :
    "ciao come stai" in uscita dovremmo avere "ciao stai", ma per ovviare al problema che in stringa2 venissero copiati
    il primo spazio dopo "ciao" e il secondo spazio dove "come", ho usato un ulteriore switch case che elimina tale spazio superfluo

    Il codice viene commentato riga per riga.

    */

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>// usa tutte le funzioni sulle stringhe
    #define lunmax 80 // Costante per il numero massimo di caratteri in una stringa
    void elabora(char vet[]);//Prototipo funzione
    int main()
    {
    int scelta,instringa=0;//scelta per la scelta del menù,
    char strin[lunmax] ; //vettore di caratteri

    do{
    //######################################
    //############### M E N U ' ############
    //######################################
    system("CLS"); // Pulitura schermo
    system("title Esercizio Stringhe");//intestazione della finestra di esecuzione
    system("color 0b"); // cambio colore sfondo e testo
    printf("\n\n\n\t\t################## MENU' ################## \n");
    printf("\t\t-------------------------------------------");
    printf("\n\t\t 0. per uscire ");
    printf("\n\t\t 1. Inserimento di una stringa ");
    printf("\n\t\t 2. Elaborazione stringa ");
    printf("\n\t\t-------------------------------------------");
    printf("\n\t\t Fai la tua scelta :==> ");
    scanf("%d",&scelta); // variabile di scelta per le varie opzioni del menu'
    //________________________________________ Fine Menù ____________________________________
    getchar();//dopo l'uso di uno scanf viene impostato automaticamente un ritorno a capo \n quindi un successivo gets
    // in qualsiasi parte del codice, leggerebbe \n come un ritorno a capo della stringa da inserire. Per ovviare
    // a questo problema viene utilizzato la funzione getchar() per cancellare appunto il ritorno a capo \n
    switch (scelta) // scelta delle opzioni
    {
    case 0: //uscita
    break;
    case 1: // scelta per l'inserimento della stringa

    printf("\n\nInserisci una stringa massimo 80 caratteri minuscoli : ");//stampo a videao la richiesta all'utente
    gets(strin); // con scanf la stringa termina con uno spazio. per ovviare al problema si usa gets(stringa)
    printf("La tua stringa e' stata inserita correttamente \n");
    system("\nPause");// comando per impostare una pausa
    instringa=1;// assegnazione per il controllo se è stata inserita una stringa prima di procedere al passo 2
    break;

    case 2: // scelta elaborazione della stringa, viene effettuata solo se è stata inserita una stringa
    system("CLS");
    system("color 0e");

    if(instringa!=1) // controllo se è stata inserita una stringa
    {
    printf("\n\n\n\tAttenzione devi prima inserire una stringa con la scelta 1 del menu'\n\n\n");
    system("PAUSE");
    }
    else // se è stata insireti una stringa il programma continua
    {
    printf("\n\nLa stringa da te inserita e' : %s\n",strin);
    elabora (strin);//chiamata alla Funzione con passaggio della stringa acquisita
    instringa=0;//assegnazione di verifica per far inserire una nuova stringa adogni avvio del menù
    system("PAUSE");
    }
    }//switch
    }while(scelta!=0);//chiusura del do iniziale e condizione del loop menù
    //il programma terminerà quando dal menù si sceglierà '0'
    return 0;
    }


    void elabora(char stringa[]) // funzione elabora
    {
    int i=0,j=0,cont=1,lung;// i e j=contatore per i cicli e/o indici vettori, conta=contatore per il carattere 'a' lung= lunghezza della stringa
    int modulo;//per definire se copiare o meno nella stringa //parola= conteggio delle parole, app=variabile di appoggio per il cambio tipo
    char stringa2[lunmax]; //Vettore appoggio per inserire la stringa senza spazi

    while (stringa !='\0')//terminatore di stringa serve a scorrere tutta la stringa inserita
    {
    modulo=cont%2;// se il resto è 0 significa che non deve copiare la parola nella stringa2
    if(stringa!=' ')// confronto per vedere se ci sono spazi vuoti
    {
    switch(modulo)
    {
    case 0: //caso PARI in cui bisogna solo spostare l'indice senza copiare in stringa2
    i++;
    break;
    case 1: //caso DISPARI in cui bisongna copiare la porala in stringa2
    stringa2[j]=stringa;// copia di ogni singolo carattere in stringa2
    i++; //incremento indice della stringa
    j++; //incremento indice della stringa2
    break;
    }//chiusura switch
    }else //chiusura if
    { //inizio else
    switch(modulo) // per che in stringa2 vengano copiati due spazi
    {
    case 0:
    cont++;//conteggio parole
    i++; //incremento indice stringa
    j++; //incremento indice stringa2
    break;


    case 1:
    cont++;//conteggio parole
    stringa2[j]=stringa;
    i++; //incremento indice vettore e conteggio caratteri
    break;
    }//chiusura switch
    }//chiusura else
    }//chiusura while
    stringa2[j]='\0';//serve per definire la fine della stringa2
    lung=i; // lung per mantere la grandezza della stringa, altrimenti la 'i' andrebbe perso con il prossimo ciclo for
    printf("Nella stringa ci sono %d caratteri \nLe parole sono : %d \n",lung,cont);// stampa il numero di caratteri e il numero di parole
    printf("\n\n\nLa stringa con le parole dispari e' :%s \n",stringa2);// stampa della nuova stringa con le sole parole di posto dipsari
    printf("\n\n\n");// righe di separazione
    system("\n\n\npause");
    printf("\n\nATTENZIONE LA TUA STRINGA ORA E' STATA CANCELLATA \n");

    }//Fine Funzione elabora


    Bye bye!!
  • Re: C... Stringhe, stampare solo le parole dispari!

    
    void print_dispari(char* stringa)
    {
        int i;
        for(i=0; stringa[i]; ++i)
            if ( stringa[i] & 1 ) 
                putchar(stringa[i]);
    }
    
  • Re: C... Stringhe, stampare solo le parole dispari!

    Vbextreme mi sa che questa volta non hai capito...
  • Re: C... Stringhe, stampare solo le parole dispari!

    
    void print_odd_word(char* stringa)
    {
        int o = 0;
        char* s = stringa
        while( *s )
        {
            if ( *s == ' ' )
            {
                if ( o ) printf("%.*s\n", s - stringa, stringa);
                o = !o;
                while( *s && *s == ' ') ++s;
                stringa = s;
            }
        }
        if ( o && *(s-1) != ' ' )
            printf("%.*s\n", s - stringa, stringa);
    }
    
    @oregon, mi sa che dormivo ancora.......
    Non ci metto la mano sul fuoco ma sicuramente dovrei aver azzeccato il bersaglio

    comunque con una strtok sarebbe stato piu elegante
  • Re: C... Stringhe, stampare solo le parole dispari!

    Scusatemi amici,
    è stato un mio errore non avervi dato forse i giusti dettagli vediamo di capirci meglio!!!!

    Allora non volevo usare le funzioni presenti in <string.h> tranne ovviamente per l'acquisizione della stringa da elaborare con gets, e per ovvi motivi non posso utilizzare i puntatori..... se avete qualche soluzione diversa e più compatta da quella che ho postato è sempre ben accetta.....
    Grazie di tutto!

    Massimiliano
  • Re: C... Stringhe, stampare solo le parole dispari!

    Scusa ma il mio usa solo printf che non fa parte di string.h
  • Re: C... Stringhe, stampare solo le parole dispari!

    Ma hai usato i puntatori o sbaglio??

    Non posso usare i puntatori!!
  • Re: C... Stringhe, stampare solo le parole dispari!

    Sostituisci gli asterischi con le quadre ed un indice.
    Il concetto non cambia
Devi accedere o registrarti per scrivere nel forum
9 risposte