Guest User

Untitled

a guest
Jul 18th, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.00 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. //Outputfuction, very simple
  5. void output(int len, int * text)
  6. {
  7. int i;
  8. for (i = 0; i < len; i++)
  9. printf("%c",(char)text[i]);
  10. }
  11.  
  12. //------------------------------------------------------------------------------
  13. //Reads a character from stdin (as an integer), returns a pointer to the start
  14. // of the text and length of the text as an integer in case of sucess.
  15. int importCharacter(int ** alloc_me)
  16. {
  17. int * text;
  18. // counter (return value)
  19. int text_length = 0;
  20.  
  21. // init vars
  22. int blocksize = 10, memsize = 10;
  23. *alloc_me = malloc(memsize*sizeof(int));
  24. if (alloc_me == NULL)
  25. {
  26. return -2;
  27. }
  28. text = *alloc_me;
  29.  
  30. int newChar;
  31. while ((newChar = getchar()) != EOF)
  32. {
  33. if (text_length == memsize)
  34. {
  35. memsize += blocksize;
  36. int * tmp;
  37. tmp = realloc(*alloc_me, memsize*sizeof(int));
  38. if (tmp == NULL)
  39. {
  40. return -2;
  41. }
  42. *alloc_me = tmp;
  43. }
  44. if (newChar > 127)
  45. {
  46. return -3;
  47. }
  48.  
  49. text[text_length] = newChar;
  50. text_length++;
  51. }
  52. //Nachdem alle Zeichen gelesen sind (getchar() = EOF) kommt die L?nge des
  53. //eingelesenen Textes zur?ck.
  54. return text_length;
  55. }
  56.  
  57. int ReplaceCharacters (int ** alloc_me_changed, int * text
  58. , int text_length, int * changed)
  59.  
  60. {
  61. // init vars
  62. int * text_changed = NULL;
  63. int text_length_changed = 0;
  64. // int * my_text = NULL;
  65. // int text_length = importCharacter(&my_text);
  66. // da liest du den ganzen text noch einmal -> von main übergeben
  67. // int changed = 0; als adresse übergeben
  68. int blocksize = 10, memsize = 10;
  69. int MaxReplaceStrLength = 5;
  70. *alloc_me_changed = malloc((memsize)*sizeof(int));
  71. if (alloc_me_changed == NULL)
  72. {
  73. return -2;
  74. }
  75.  
  76. text_changed = *alloc_me_changed;
  77. int newChar;
  78. int counter = 0;
  79. // Counter from first character in text to text_length
  80. while (counter < text_length)
  81. {
  82. newChar = text[counter];
  83. if (text_length_changed >= (memsize - MaxReplaceStrLength))
  84. {
  85. memsize += blocksize;
  86. int * tmp;
  87. tmp = realloc(*alloc_me_changed, memsize*sizeof(int));
  88. if (tmp == NULL)
  89. {
  90. return -2;
  91. }
  92. *alloc_me_changed = tmp;
  93.  
  94. }
  95. switch (newChar)
  96. {
  97. case 38 : // &
  98. text_changed[text_length_changed++] = '&';
  99. text_changed[text_length_changed++] = 'a';
  100. text_changed[text_length_changed++] = 'm';
  101. (*changed)++;
  102. break;
  103. case 60 : // <
  104. text_changed[text_length_changed++] = '&';
  105. text_changed[text_length_changed++] = 'l';
  106. text_changed[text_length_changed++] = 't';
  107. (*changed)++;
  108. break;
  109. case 62 : // >
  110. text_changed[text_length_changed++] = '&';
  111. text_changed[text_length_changed++] = 'g';
  112. text_changed[text_length_changed++] = 't';
  113. (*changed)++;
  114. break;
  115. case 64 : // @
  116. text_changed[text_length_changed++] = ' ';
  117. text_changed[text_length_changed++] = '[';
  118. text_changed[text_length_changed++] = 'a';
  119. text_changed[text_length_changed++] = 't';
  120. text_changed[text_length_changed++] = ']';
  121. text_changed[text_length_changed++] = ' ';
  122. (*changed)++;
  123. break;
  124.  
  125. default : text_changed[text_length_changed++] = newChar;
  126. break;
  127. }
  128. counter++;
  129. // text_length_changed++;
  130. }
  131. //Nachdem alle Zeichen gelesen sind (counter=text_length) kommt die L?nge des
  132. //eingelesenen Textes zur?ck.
  133. return text_length_changed;
  134. }
  135. int main()
  136. {
  137.  
  138. int * my_text = NULL;
  139. int * text_changed = NULL;
  140. // read text
  141. int len1 = importCharacter(&my_text);
  142. if (len1 <= 0)
  143. {
  144. switch (len1)
  145. {
  146. case 0:
  147. printf ("No input text.\n");
  148. len1 = -1;
  149. break;
  150.  
  151. case -2:
  152. printf ("Out of Memory.\n" );
  153. break;
  154.  
  155. case -3:
  156. printf ("Invalid Input Character.\n" );
  157. break;
  158.  
  159. default:
  160. printf ("Unknown error.\n");
  161. break;
  162. }
  163. free (my_text);
  164. return len1;
  165. }
  166.  
  167. // write original text
  168. output (len1, my_text);
  169. printf("\n----------\n");
  170.  
  171. // replace special characters by strings
  172.  
  173. int NChanged = 0;
  174. int len2 = ReplaceCharacters(&text_changed, my_text, len1, &NChanged);
  175. if (len2 <= 0)
  176. {
  177. switch (len2)
  178. {
  179. case 0:
  180. printf ("No input text.\n");
  181. len2 = -1;
  182. break;
  183.  
  184. case -2:
  185. printf ("Out of Memory.\n" );
  186. break;
  187.  
  188. case -3:
  189. printf ("Invalid Input Character.\n" );
  190. break;
  191.  
  192. default:
  193. printf ("Unknown error.\n");
  194. break;
  195. }
  196. free (my_text);
  197. free (text_changed);
  198. return len2;
  199. }
  200. // write text with replacements
  201. output (len2, text_changed);
  202. printf("\n----------\n");
  203. // write statistics
  204. printf("original string: %d chars\n", len1);
  205. printf("modified string: %d chars\n", len2);
  206. printf("modified chars : %d\n", NChanged);
  207. free (my_text);
  208. free (text_changed);
  209. return 0;
  210.  
  211. }
Add Comment
Please, Sign In to add comment