Δημοσιεύτηκε: 18 Ιουν 2011, 15:14
από migf1
Με την ευκαιρία βρήκα κι ένα bug στον δικό μου κώδικα! Το dummy πρέπει να το ορίζω ως σκέτο char και όχι ως δείκτη σε char (πάω να το διορθώσω και στο προηγούμενο ποστ, αλλά και στη Ξερή :( )

Σημείωση: λειτουργεί μονάχα με αρχικοποιημένα strings!

Δηλαδή το:
Κώδικας: Επιλογή όλων
puts( s_reverse( "Hello cruel world") );
ΚΡΑΣΑΡΕΙ, κι είναι λογικό γιατί σε αυτή την περίπτωση δεν του περνάμε δικιά μας μεταβλητή string, αλλά string literal (δηλαδή σταθερά τύπου string" που δεν είναι αποθηκευμένη σε δικιά μας μεταβλητή). Για τα string literals ο compiler δημιουργεί δικές του εσωτερικές μεταβλητές τύπου string, οι οποίες είναι όμως READ ONLY, κι εδώ η s_reverse() αλλάζει τα περιεχόμενα του ορίσματος s.

Θέλει:
Κώδικας: Επιλογή όλων

char s[] = "Hello cruel world";
puts( s_reverse(s) );

Παραθέτω και τις 2 εκδόσεις του κώδικα, με και χωρίς δείκτες ;)
Spoiler: show
Κώδικας: Επιλογή όλων

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

// ***********************************************************
char *s_reverse1(char s[])
{
if ( !s ) // early exit
return NULL;

char dummy;
register int i,j;

j = strlen(s) - 1;
for (i=0; i < j; i++, j--) {
dummy = s[i];
s[i] = s[j];
s[j] = dummy;
}

return s;
}
// ***********************************************************
char *s_reverse2(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[] = "Hello cruel world";
puts( s_reverse1(s) );
puts( s_reverse2(s) );

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