Δημοσιεύτηκε: 16 Φεβ 2012, 00:16
από migf1
Κώδικας: Επιλογή όλων

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

#define pressENTER() \
do{ \
char mYcHAr; \
printf( "press ENTER..." ); \
while ( (mYcHAr=getchar()) != '\n' && mYcHAr != EOF ) \
; \
}while(0)

/*********************************************************//**
*
************************************************************/
int s_swap( char **s1, char **s2 )
{
char *temp = NULL;

if ( !s1 || !s2 )
return 0; /* FALSE */

temp = *s1;
*s1 = *s2;
*s2 = temp;

return 1; /* TRUE */
}

/*********************************************************//**
*
************************************************************/
int s_swap_static( char *s1, char *s2, const int maxlen )
{
char *temp = NULL;
size_t size = maxlen * sizeof(char);

if ( !s1 || !s2 || maxlen < 1 || NULL == (temp=malloc(size)) )
return 0; /* FALSE */

memcpy(temp, s1, size);
memcpy(s1, s2, size);
memcpy(s2, temp, size);

free( temp );
return 1; /* TRUE */
}

/*********************************************************//**
*
************************************************************/
#define myMAX(x,y) ( (x) > (y) ? (x) : (y) )
int s_swap_static2( char *s1, char *s2 )
{
char *temp = NULL;
size_t size = 0;

if ( !s1 || !s2 )
return 0; /* FALSE */

size = myMAX(strlen(s1), strlen(s2)) * sizeof(char);
if ( NULL == (temp = malloc(size)) )
return 0; /* FALSE */

memcpy(temp, s1, size);
memcpy(s1, s2, size);
memcpy(s2, temp, size);

free( temp );
return 1; /* TRUE */
}

/*********************************************************//**
*
************************************************************/
int s_swap_static3( char *s1, char *s2 )
{
char c = '\0', *cp = NULL;
int i = 0;

if ( !s1 || !s2 )
return 0; /* FALSE */

for (i=0; s1[i] && s2[i]; i++)
{
c = s1[i];
s1[i] = s2[i];
s2[i] = c;
}

if ( '\0' != *(cp = &s1[i]) ) {
while ( s1[i] )
s2[i] = s1[i++];
*cp = '\0';
}
else if ( '\0' != *(cp = &s2[i]) ) {
while ( s2[i] )
s1[i] = s2[i++];
*cp = '\0';
}

return 1; /* TRUE */
}
/*********************************************************//**
*
************************************************************/
int main( void )
{
/* string literals */
char *s1 = "str1long";
char *s2 = "str2";
/* static strings of same max length */
char t1[ 80+1 ] = "str1long";
char t2[ 80+1 ] = "str2";

/* swap string literals */

puts("\nBEFORE s_swap():");
printf("\ts1 = %s\n\ts2 = %s\n", s1, s2 );

if ( !s_swap(&s1, &s2) )
puts("*** s_swap() failed!");

puts("AFTER:");
printf("\ts1 = %s\n\ts2 = %s\n", s1, s2 );

/* Method 1: swap static strings of same max length */

puts("\nBEFORE s_swap_static():");
printf("\tt1 = %s\n\tt2 = %s\n", t1, t2 );

if ( !s_swap_static(t1, t2, 80+1) )
puts("*** s_swap_static() failed!");

puts("AFTER:");
printf("\tt1 = %s\n\tt2 = %s\n", t1, t2 );

/* Method 2: swap static strings of same max length */

puts("\nBEFORE s_swap_static2():");
printf("\tt1 = %s\n\tt2 = %s\n", t1, t2 );

if ( !s_swap_static2(t1, t2) )
puts("*** s_swap_static2() failed!");

puts("AFTER:");
printf("\tt1 = %s\n\tt2 = %s\n", t1, t2 );

/* Method 3: swap static strings of same max length */

puts("\nBEFORE s_swap_static3():");
printf("\tt1 = %s\n\tt2 = %s\n", t1, t2 );

if ( !s_swap_static3(t1, t2) )
puts("*** s_swap_static3() failed!");

puts("AFTER:");
printf("\tt1 = %s\n\tt2 = %s\n", t1, t2 );

pressENTER();
exit( EXIT_SUCCESS );
}