fork download
  1. /* ==================================================
  2.  * author: migf1
  3.  * Mark (remove) duplicates from a table of strings
  4.  * ==================================================
  5.  */
  6.  
  7. #include <stdio.h>
  8. #include <string.h>
  9.  
  10. #define MAXSTRINGS 100 /* μέγιστο πλήθος strings στον πίνακα */
  11. #define STRSIZE 20+1 /* μέγιστο μέγεθος για κάθε string */
  12. #define DELETED_STRING "*"
  13.  
  14. /* ----------------------------------------------------------------------------------
  15.  * void strtable_dump( char stab[ MAXSTRINGS ][ STRSIZE ] );
  16.  *
  17.  * Τύπωμα με τη σειρά όλων των strings του πίνακα stab, μέχρι να τελειώσει ο πίνακας
  18.  * ή μέχρι να βρεθεί κενό string ( κενά strings θεωρούνται όσα ο 1ος τους χαρακτήρας
  19.  * ισούται με '\0' )
  20.  * ----------------------------------------------------------------------------------
  21.  */
  22. void strtable_dump( char stab[ MAXSTRINGS ][ STRSIZE ] )
  23. {
  24. register int i;
  25.  
  26. /* empty table */
  27. if ( *(stab[0]) == '\0' ) {
  28. puts("<empty>");
  29. return;
  30. }
  31.  
  32. /* non-empty table */
  33. for (i=0; i < MAXSTRINGS && *(stab[i]) != '\0'; i++)
  34. puts( stab[i] );
  35.  
  36. return;
  37. }
  38.  
  39. /* ----------------------------------------------------------------------------------
  40.  * void strtable_print( char stab[ MAXSTRINGS ][ STRSIZE ] );
  41.  *
  42.  * Τύπωμα με τη σειρά όλων των strings του πίνακα stab που δεν έχουν μαρκαριστεί
  43.  * ως διαγραμμένα, μέχρι να τελειώσει ο πίνακας ή μέχρι να βρεθεί κενό string
  44.  * ( κενά strings θεωρούνται όσα ο 1ος τους χαρακτήρας ισούται με '\0' )
  45.  * ----------------------------------------------------------------------------------
  46.  */
  47. void strtable_print( char stab[ MAXSTRINGS ][ STRSIZE ] )
  48. {
  49. register int i;
  50.  
  51. /* empty table */
  52. if ( *(stab[0]) == '\0' || *(stab[0]) == DELETED_STRING[0] ) {
  53. puts("<empty>");
  54. return;
  55. }
  56.  
  57. /* non-empty table */
  58. for (i=0; i < MAXSTRINGS && *(stab[i]) != '\0'; i++)
  59. if ( *(stab[i]) != DELETED_STRING[0] )
  60. puts( stab[i] );
  61.  
  62. return;
  63. }
  64.  
  65. /* ----------------------------------------------------------------------------------
  66.  * int strtable_posfind( int pos, char stab[ MAXSTRINGS ][ STRSIZE ] );
  67.  *
  68.  * Αν το string που βρίσκεται στη θέση pos του πίνακα stab υπάρχει σε οποιαδήποτε
  69.  * από τις προηγούμενες θέσεις του πίνακα, η συνάρτηση ΕΠΙΣΤΡΕΦΕΙ τη θέση στην οποία
  70.  * βρέθηκε. Αν δεν βρεθεί ή αν η θέση pos περαστεί με αρνητική τιμή ή με τιμή
  71.  * μεγαλύτερη της MAXSTRINGS-1 ή αν ο πίνακας είναι άδειος, τότε η συνάρτηση
  72.  * ΕΠΙΣΤΡΕΦΕΙ την τιμή -1.
  73.  *
  74.  * ΣΗΜΕΙΩΣΗ:
  75.  * Η αναζήτηση ξεκινάει από την αρχή του πίνακα και σταματάει είτε όταν βρεθεί η
  76.  * 1η εμφάνιση του string, είτε όταν φτάσουμε στην θέση pos, είτε όταν βρεθεί κενό
  77.  * string ( κενά strings είναι όσα ο 1ος τους χαρακτήρας ισούται με '\0' ).
  78.  * ----------------------------------------------------------------------------------
  79.  */
  80. int strtable_posfind( int pos, char stab[ MAXSTRINGS ][ STRSIZE ] )
  81. {
  82. register int i=0;
  83.  
  84. /* sanity checks */
  85. if ( pos < 0 || pos > MAXSTRINGS-1 )
  86. return -1;
  87.  
  88. for ( i=0; i < pos && *(stab[i]) != '\0'; i++ )
  89. if ( !strcmp( stab[ pos ], stab[i] ) )
  90. break;
  91.  
  92. if ( i == pos || *(stab[i]) == '\0' )
  93. return -1;
  94.  
  95. return i;
  96. }
  97.  
  98. /* ----------------------------------------------------------------------------------
  99.  * void strtable_markdups( char stab[ MAXSTRINGS ][ STRSIZE ] );
  100.  *
  101.  * Απαλοιφή τυχόν πολλαπλών εμφανίσεων ενός string μέσα σε πίνακα από strings.
  102.  * Στο τέλος το κάθε string εμφανίζεται ακριβώς μια φορά μέσα στον πίνακα, με
  103.  * τους "κλώνους" να έχουν πάρει την τιμή της σταθεράς: DELETED_STRING
  104.  * ----------------------------------------------------------------------------------
  105.  */
  106. void strtable_markdups( char stab[ MAXSTRINGS ][ STRSIZE ] )
  107. {
  108. register int i = 0;
  109.  
  110. /* empty table */
  111. if ( (*stab[0]) == '\0' )
  112. return;
  113.  
  114. /* non-empty table */
  115. for (i=0; i < MAXSTRINGS && *(stab[i]) != '\0'; i++)
  116. {
  117. if ( strtable_posfind( i, stab ) != -1 ) /* stab[i] already exists */
  118. strncpy( stab[ i ], DELETED_STRING, STRSIZE-1 );
  119. }
  120.  
  121. return;
  122. }
  123.  
  124. /* ------------------------------------------------------- */
  125. int main( void )
  126. {
  127. char strtable[ MAXSTRINGS][ STRSIZE ] = {
  128. "red", "blue", "green", "red", "yellow", "blue", "blue", "red", "green"
  129. };
  130.  
  131. puts("Before:\n---------------------");
  132. strtable_dump( strtable );
  133.  
  134. strtable_markdups( strtable );
  135.  
  136. puts("\nAfter (raw):\n---------------------");
  137. strtable_dump( strtable );
  138.  
  139. puts("\nAfter (interfaced):\n---------------------");
  140. strtable_print( strtable );
  141.  
  142. return 0;
  143. }
  144.  
Success #stdin #stdout 0s 1720KB
stdin
Standard input is empty
stdout
Before:
---------------------
red
blue
green
red
yellow
blue
blue
red
green

After (raw):
---------------------
red
blue
green
*
yellow
*
*
*
*

After (interfaced):
---------------------
red
blue
green
yellow