Advertisement
Guest User

Untitled

a guest
Mar 27th, 2015
209
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.95 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <malloc.h>
  4.  
  5. char *getStr();
  6. char *reorg(char *);
  7. char *skipSpace(char *);
  8. char *skipWord(char *);
  9. char *copyWord(char *, char *);
  10.  
  11. char *getStr()
  12. {
  13. char buf[21];
  14. int n, len = 0, curLen;
  15. char *ptr = (char *)malloc(1);
  16. *ptr = '\0';
  17.  
  18. do{
  19. n = scanf_s("%20[^\n]", buf, 21);
  20. if (n < 0){
  21. free(ptr);
  22. ptr = NULL;
  23. continue;
  24. }
  25. if (n > 0){
  26. curLen = strlen(buf);
  27. len += curLen;
  28. ptr = (char *)realloc(ptr, len + 1);
  29. strcat_s(ptr, len + 1, buf);
  30. }
  31. else
  32. scanf_s("%*c", 0);
  33. } while (n > 0);
  34. return ptr;
  35. }
  36.  
  37. int main()
  38. {
  39. char *s = NULL, *p = NULL;
  40.  
  41. while (puts("enter..."), s = getStr()){
  42. printf("Source string: \"%s\"\n", s);
  43. p = reorg(s);
  44. printf("Result string: \"%s\"\n", p);
  45. free(s);
  46. free(p);
  47. }
  48. puts("That's all. Bye!");
  49. return 0;
  50. }
  51.  
  52. char *reorg(char *s)
  53. {
  54. // Выделяем память под результирующую строку
  55. char *p = (char *)malloc(strlen(s) + 1);
  56. char *tmp = p,first,last,*buf;
  57. *tmp = '\0'; // нуль ограниченная результирующая строка
  58. if (*(s = skipSpace(s))){
  59. first = s[0];
  60. tmp = copyWord(s, tmp);
  61. s = skipWord(s);
  62. last = s[-1];
  63. }
  64. // Пропускаем лидирующие пробелы.
  65. while (*(s = skipSpace(s))){
  66. if (s[0] == first){
  67. buf = skipWord(s);
  68. if (buf[-1] == last){
  69. tmp = copyWord(s, tmp);
  70. }
  71. }
  72. s = skipWord(s);
  73. }
  74.  
  75. // удаление хвостового пробела
  76. if (p != tmp)
  77. *--tmp = '\0';
  78. p = (char *)realloc(p, strlen(p) + 1);
  79.  
  80. return p;
  81. }
  82.  
  83. char *skipSpace(char *s)
  84. {
  85. int k = strspn(s, " \t");
  86. return s + k;
  87. }
  88.  
  89. char *skipWord(char *s)
  90. {
  91. int k = strcspn(s, " \t");
  92. return s + k;
  93. }
  94.  
  95. char *copyWord(char *from, char *to)
  96. {
  97. int k = strcspn(from, " \t");
  98. int l = strlen(to) + k;
  99. strncat_s(to, l + 1, from, k);
  100. to += k;
  101. *to++ = ' ';
  102. *to = '\0';
  103. return to;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement