Δημοσιεύτηκε: 12 Ιούλ 2011, 14:47
από migf1
migf1 έγραψε:
linuxs έγραψε:Θα δώ τον δικό σου αλλα μπορώ να το επεκτείνω και αν θέλω και άλλο χωρο να παω με realloc()...είναι το πως ακριβώς θέλεις να το κάνεις! ;) Εγώ το αφήνω έτσι γιατί κάνω μια ιστοσελίδα αυτή τη στιγμή και βλέπουμε. Θα το βάλω στο πρώτο post μην ανησυχείς!

Ας περιμένουμε και τον φίλο maenolis.

Έχω την εντύπωση πως ο φίλος maneolis δεν βρήκε χρόνο να ασχοληθεί, οπότε παραθέτω την δική μου υλοποίηση. Βασικά έχω κάνει 2 υλοποιήσεις, μια στην οποία η αντιστροφή γίνεται απευθείας στην main() και οι λέξεις τυπώνονται απευθείας στην οθόνη, και μια όπου η αντιστροφή γίνεται μέσα σε συνάρτηση που δέχεται ως όρισμα την αρχική πρόταση και την επιστρέφει με αντεστραμμένες τις λέξεις της.

Παραθέτω (σε spoiler) την πρώτη υλοποίηση που είναι πιο εύκολη κι όταν μου δώσετε το οκ θα παραθέσω και την υλοποίηση με τη συνάρτηση.

Και οι 2 υλοποιήσεις είναι ανεξάρτητες από το πλήθος των λέξεων στην αρχική πρόταση και χρησιμοποιούν τον ίδιον αλγόριθμο για την αντιστροφή.

Spoiler: show
Κώδικας: Επιλογή όλων

/* ------------------------------------------------------------
* Από: migf1 Έκδοση ΧΩΡΙΣ Συνάρτηση
*
* Αντιστροφή λέξεων μιας πρότασης. Π.χ. το "γειά σου κόσμε"
* γίνεται "κόσμε σου γεια"
*
* Αλγόριθμος:
* πρώτα αντιστρέφεται η αρχική πρόταση και κατόπιν διασπάται
* στις λέξεις της, οι οποίες αντιστρέφονται εκ νέου πριν
* τυπωθούν μια προς μια στην οθόνη.
* ------------------------------------------------------------
*/

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

// ------------------------------------------------------------------------------------
// Αντιστρέφει το string s. Βάζει από έναν δείκτην στην αρχή και το τέλος του s, κι
// εναλλάσει τους χαρακτήρες τους μέχρι να συναντηθούν οι δυο δείκτες στη μέση του s
// ΣΗΜΑΝΤΙΚΟ: το s πρέπει να είναι ήδη δημιουργημένο.
//
char *s_reverse(char *s)
{
if ( !s ) // early exit
return NULL;

char *cp1, *cp2, dummy;

cp2 = s + strlen(s) - 1; // set cp2 at end of s
for (cp1=s; cp1 < cp2; cp1++, cp2--) {
dummy = *cp1;
*cp1 = *cp2;
*cp2 = dummy;
}

return s;
}

// ------------------------------------------------------------------------------------
int main( void )
{
char s[255+1]="", *delims=" \t\n", *cp;

printf("Enter a sentence: ");
fgets(s, 256, stdin);

s_reverse(s);
cp = strtok(s, delims);
while (cp != NULL) {
printf("%s ", s_reverse(cp) );
cp = strtok(NULL, delims);
}
putchar('\n');

fflush(stdin); getchar();
exit( EXIT_SUCCESS );
}