Spoiler: show
Συντονιστής: konnn


migf1 έγραψε:Το error στο βγάζει γιατί τον *pointer τον ορίζεις δείκτη σε int αλλά του εκχωρείς διεύθυνση char (το s[0] είναι char, άρα το &s[0] είναι διεύθυνση από char).
Σε ότι αφορά το κώδικα, το 'χεις πιάσει το γενικό νόημα αλλά με κάποιες ελλείψεις. Π.χ. δεν χρειάζεται να ελέγχεις για '\n' στη συνθήκη του while. Ο χαρακτήρας που σηματοδοτεί το τέλος ενός string είναι ο '\0'. Άρα είναι απόλυτα θεμιτό να υπάρχουν '\n' χαρακτήρες μέσα σε ένα string (π.χ. μπορεί να περιέχει τα περιεχόμενα ενός text editor, άρα θα υπάρχουν πολλοί '\n' μέσα στο string, για τις αλλαγές των γραμμών).
Επίσης, οι συναρτήσεις επιστρέφουν το μήκος του string μετρώντας και τον μηδενικό χαρακτήρα στο τέλος, ενώ η εκφώνηση επισημαίνει πως δεν πρέπει να τον συμπεριλαμβάνουν στο αποτέλεσμα που επιστρέφουν (όπως ακριβώς δεν τον συμπεριλαμβάνει η κανονική strlen).
Και τέλος, δεν είναι σοφή πρακτική να ονοματίζεις τις συναρτήσεις σου με ονόματα στάνταρ συναρτήσεων. Σου άλλαξα τον κώδικά σου (δες παρακάτω)... μένει να τον φτιάξεις να μην συμπεριλαμβάνει τον μηδενικό χαρακτήρα στο μήκος που επιστρέφει.Spoiler: show
Αν δεν ασχοληθεί άλλος να δώσω κι εγώ τις λύσεις, γιατί διαφέρουν από τις λύσεις του φίλου Σταματίου.

stamatiou έγραψε:Ναι αλλά κανονικά δεν θα μπορούσα να το κάνω και int αφού ουσιαστικά τα chars είναι ints με βάση το ASCI table;
size_t mystrlen( const char *s)
{
const int *pointer = (int *) &s[0];
...
}
έγραψε:Επίσης έκανα τις συναρτήσεις να μην μετρούν το \n επειδή πχ έγραφα abc και έβγαζε 4 γι' αυτό είπα να το αφήσω να μετρά μικρά κομμάτια κειμένου


Εκει που γράφει ++i και το ίδιο για τον pointer αφού προσθέτει πριν το ελέγξει το while πώς ελέγχεται το πρώτο char; Επίσης στο πρώτο τι κάνει ακριβώς εκείνο το return;migf1 έγραψε:Δίνω και τη δική μου λύση:Spoiler: show
Συγκριτικά με την στάνταρ strlen() αυτές είναι βελτιωμένες ως προς το ότι ελέγχουν και την περίπτωση κατά την οποία τους περαστεί NULL ως όρισμα, οπότε κι επιστρέφουν -1 σαν αποτέλεσμα. Στην στάνταρ strlen() αν της περάσουμε NULL ως όρισμα, κράσαρει.
Αν δεν καταλαβαίνετε κάτι στον κώδικα, πείτε να το διευκρινίσουμε περαιτέρω.

stamatiou έγραψε:Εκει που γράφει ++i και το ίδιο για τον pointer αφού προσθέτει πριν το ελέγξει το while πώς ελέγχεται το πρώτο char;
έγραψε:Επίσης στο πρώτο τι κάνει ακριβώς εκείνο το return;
while ( *cp != '\0')
cp++;while ( *cp )
cp++;
while ( *cp++)
;
return --cp-s;

Qdata έγραψε:Επιτέλους το βρήκα!![]()
Με πέδεψε πάρα πολύ αλλά με βοήθησε αφού μέχρι να την λύσω χρησιμοποίησα δείκτες,συναρτήσεις κτλ.Τελικά το μόνο που χρειαζόταν ήταν σκέψη στον τρόπο και όχι στον κώδικα!Να και η λύση:(Συγνώμη που δεν χρησιμοποίησα πολλά σχόλια.Θα προσπαθήσω να κάνω πιο ευανάγνωστο τον κώδικα.)Spoiler: show
Επίσης ξέρω πως η γραμμή:Δεν είναι ότι το καλύτερο για να συγκρίνω την θέση του πίνακα αλλά όταν χρησιμοποιούσα κάτι άλλο που έβγαζε σφάλματα.Spoiler: show
@migf1 Πολύ ωραία η άσκηση!![]()
#define bool int
#define TRUE 1
#define FALSE 0
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int compare(char *s,char *st,int i)
{
if ( i > -1 )
{
if ( *s != *st)
return FALSE;
return compare(++s,--st,--i);
}
return TRUE;
}
void check_arg(char *arg[] )
{
if (arg[1] == NULL)
{
printf("Δέν έχει δωθεί όρισμα.\n");
exit(EXIT_FAILURE);
}
if (arg[2] == NULL)
{
printf("Δέν έχει δωθεί δεύτερο όρισμα.\n");
exit(EXIT_FAILURE);
}
if ( strlen(arg[1]) != strlen(arg[2]) )
{
printf("Οι λέξεις δέν έχουν το ίδιο μήκος.\n");
exit(EXIT_FAILURE);
}
}
int main(int argc, char *argv[])
{
int len;
bool cmp;
check_arg(argv);
len = strlen(argv[1]) -1;
cmp = compare( argv[1], argv[2] + len, len);
if ( cmp )
printf("Οι λέξεις είναι αντιστραμένες.\n");
else
printf("Δέν είναι αντιστραμένες.\n");
exit(EXIT_SUCCESS);
}

stamatiou έγραψε:Οκ, τώρα κάτι άσχετο. Αν ήθελα να κάνω το περιεχόμενο ενός pointer ++ πως θα το έκανα αφού εσυ κανείς *cp++ και απευθύνεται στη διεύθυνση;
(*cp)++