PDA

Visualizza la versione completa : [C] Stampare in ordine inverso le parole di una frase


MrLukeKobe24
19-01-2011, 18:05
Buongiorno a tutti!
L'esercizio dice:
-prendere in input una riga di testo;
-suddividerla in token con la funzione strtok;
-inviarla in output in ordine inverso.

Il mio programma è questo:

/* Scrivere una frase, dividerla in soket e stamparli in ordine inverso */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void reverse( char *sentence );

main()
{
char s[100];

printf("Inserisci una frase:\n");
gets(s);

printf("La frase stampata con i token in ordine inverso e' :\n");
reverse(s);

putchar('\n');
system("pause");
}

void reverse( char *sentence )
{
char *tokenPtr;
char v[100];
int i;

tokenPtr = strtok(sentence, " ");
sprintf(v, "%s", tokenPtr);

while ( tokenPtr != NULL )
{
tokenPtr = strtok(NULL, " ");
sprintf(v, "%s", tokenPtr);
}

i = strlen(v);

while ( i != 0 )
{
printf("%c", v[i] );
i--;
}

}


La finestra dell'output mi da, dopo aver inserito la frase:

)llun


...naturalmente è sbagliato... Qualcuno di voi mi può aiutare?? Grazie!!

GliderKite
19-01-2011, 19:09
Questa è una possibile soluzione didattica, vedi se fa quello che vuoi te...



// Reverse sentence


#include <stdio.h>
#include <stdlib.h>
#include <string.h>




// Prints in reverse order the words of a sentence
void reverse( char *sentence, const char delimiter );



int main( int argc, char *argv[] )
{
if( argc != 2 )
{
printf( "Usage: %s <sentence>\n", argv[0] );
exit(EXIT_FAILURE);
}


reverse(argv[1], ' ');

return 0;
}




// Prints in reverse order the words of a sentence
void reverse( char *sentence, const char delimiter )
{
unsigned n; // Numbers of delimiters in the sentence
char *charPtr = NULL;


// Calculates the number of delimiters
charPtr = strchr(sentence, delimiter);
for( n = 0; charPtr != NULL; ++n, charPtr = strchr(charPtr+1, delimiter) );

// More words...
if( n )
{
// Allocates the word's array of pointers
char **rWords = (char **) malloc( (n+1) * sizeof(char *) );

if( rWords != NULL )
{
int i = 0;

// The brutal pointers
for( rWords[i] = strtok(sentence, &delimiter); i != n; rWords[i] = strtok(NULL, &delimiter) )
++i;

// Prints words in reverse order
for( i = n; i >= 0; --i)
printf( "%s\n", rWords[i] );

// Relase rWords
free(rWords);
}
}

// One word
else
printf("%s\n", sentence);
}

MrLukeKobe24
19-01-2011, 21:07
Grazie per la tua risposta! Solo che non ho ancora studiato la malloc... Dovrei svolgere questo programma solo con puntatori, vettori e funzioni per la manipolazione delle stringhe...

Laikius91
20-01-2011, 09:43
La soluzione può essere notevolmente semplificata secondo me... Ad esempio:


#include <stdio.h>
#include <string.h>

void printRevStr (char *s)
{

char c;

if (*s == '\0')
return;

else
{
c = *s;
printRevStr (s + 1);
printf ("%c", c);
}

}

int main (void)
{

char s [50];

printf ("\nInserire stringa: ");
scanf ("%s", s);

printf ("\n\nStringa stampata all'incontrario: ");
printRevStr (s);

printf ("\n\n\n");
return 0;

}

Se proprio vuoi usare anche <string.h>, potresti cambiare la procedura così:


void printRevStr (char *s)
{

char c;

if (strlen(s) == 1)
printf ("%c", *s);

else
{
c = *s;
printRevStr (s + 1);
printf ("%c", c);
}

}

MrLukeKobe24
20-01-2011, 10:11
Grazie per la tua risposta! Il programma deve fare questo:
se inserisco ciao come va deve stamparmi va come ciao


Solo che, nel tuo programma:
se inserisco ciao come va mi stampa oaic

Quindi non è ancora questa la soluzione...

Laikius91
20-01-2011, 11:26
Okok basta una piccola modifica! :fighet:
Il problema è la scanf con %s, che legge una stringa fino al primo spazio!

Tra le variabili del main, metti anche


char c;
int i = 0;

Poi, dopo aver chiesto d'inserire una stringa, fai cosi:


do
{
scanf ("%c", &c);
if (c != 10)
{
s[i] = c;
i++;
}
}
while (c != 10);
s[i] = '\0';


In questo modo ti legge la stringa fino alla pressione del carattere invio (10), compresi gli spazi :)

YuYevon
20-01-2011, 11:36
Molto più banalmente, per leggere una stringa anche oltre lo spazio si usa una fgets().

Ma comunque penso che l'op volesse solo invertire l'ordine delle parole all'interno della frase, non invertire le parole stesse.

GliderKite
20-01-2011, 12:05
Originariamente inviato da Laikius91
La soluzione può essere notevolmente semplificata secondo me... Ad esempio:


Indubbimente, in pratica sarebbe bastato solo un puntatore a char e una scansione inversa della stringa (poche righe di codice); ma chiedeva esplicitamente l'utilizzo di strtok, inoltre la mia versone è basata essenzialmente sull'aspetto didattico.

:ciauz:

Laikius91
20-01-2011, 12:13
Oddio che testa che ho! :(
Accidenti a me e alla mia fretta!
Chiedo scusa davvero!
La faccenda si complica un po'... :confused:

GliderKite
20-01-2011, 12:53
Questa in pratica fa la stessa cosa, ma ovviamente non è "didattica" e non utilizza strtok, però se ti va bene lo stesso puoi usarla, non è difficile da capire:



void reverse( char *sentence, const char delimiter )
{
char *ptr = sentence + strlen(sentence);

while( ptr-- != sentence )
{
if( *ptr == delimiter )
{
*ptr = '\0';
printf( "%s\n", ptr+1 );
}
}

printf( "%s\n", sentence );
}

Loading