fork download
  1. // ConsoleApplication1.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
  2. //
  3.  
  4. #include <iostream>
  5. #include <string.h>
  6. #include <chrono>
  7.  
  8. void TrimRight(char* s) {
  9.  
  10. size_t len = strlen(s);
  11.  
  12. char* iter = s + len - 1;
  13.  
  14. if (*iter != ' ') {
  15. // Если последний символ не пробел,
  16. // то и обрезать нечего
  17. return;
  18. }
  19.  
  20. while (*iter == ' ' /*&& iter != s*/) {
  21. // Идти от конца к началу,
  22. // пока не кончатся пробелы либо строка
  23. iter--;
  24. }
  25.  
  26. if (iter == s) {
  27. // Если строка пройдена
  28. // и полностью состоит из пробелов
  29. // то результатом будет пустая строка
  30. *iter = '\0';
  31. }
  32. else {
  33. // Если пройдены все пробелы
  34. // и поиск дошел до первого не пробела,
  35. // то заменить первый пробел на конец строки.
  36. *(iter + 1) = '\0';
  37. }
  38.  
  39. }
  40.  
  41. void TrimRight2(char* s)
  42. {
  43. char* spc = 0, *p = s;
  44.  
  45. while (*p)
  46. if (*p == ' ')
  47. for (spc = p; *++p == ' '; );
  48. else
  49. ++p;
  50.  
  51. if (spc && p != s && p[-1] == ' ')* spc = 0;
  52.  
  53. //return s;
  54. }
  55.  
  56. void TrimRight3(char* s) {
  57.  
  58. char* space = nullptr;
  59. char* p = s;
  60.  
  61. while (*p) {
  62. if (*p == ' ') {
  63. if (space == nullptr) {
  64. space = p;
  65. }
  66. p++;
  67. }
  68. else {
  69. space == nullptr;
  70. p++;
  71. }
  72. }
  73.  
  74. if (space != nullptr) {
  75. *space = '\0';
  76. }
  77.  
  78. }
  79.  
  80. int main()
  81. {
  82. const size_t len_chars = 1000;
  83. const size_t len_spaces = 10000000;
  84.  
  85. // Строка содержит символы и оканчивается на пробелы
  86. char * str = (char*)malloc(sizeof(char)*len_spaces);
  87. memset(str, ' ', len_spaces);
  88. str[len_spaces-1] = '\0';
  89. for (size_t i = 0; i < len_chars; i++) {
  90. str[i] = 'A' + rand() % ('Z' - 'A');
  91. }
  92. printf("%i\n", strlen(str));
  93. auto start = std::chrono::high_resolution_clock::now();
  94. TrimRight(str);
  95. auto finish = std::chrono::high_resolution_clock::now();
  96. std::chrono::duration<double> elapsed = finish - start;
  97. printf("%i\n", strlen(str));
  98. std::cout << "Elapsed time: " << elapsed.count() << " s\n";
  99. printf("------------\n");
  100.  
  101. //**********************************************************
  102.  
  103. char* str4 = (char*)malloc(sizeof(char) * len_spaces);
  104. memset(str4, ' ', len_spaces);
  105. str4[len_spaces - 1] = '\0';
  106. for (size_t i = 0; i < len_chars; i++) {
  107. str4[i] = 'A' + rand() % ('Z' - 'A');
  108. }
  109. printf("%i\n", strlen(str4));
  110. auto start4 = std::chrono::high_resolution_clock::now();
  111. TrimRight2(str4);
  112. auto finish4 = std::chrono::high_resolution_clock::now();
  113. std::chrono::duration<double> elapsed4 = finish4 - start4;
  114. printf("%i\n", strlen(str4));
  115. std::cout << "Elapsed time: " << elapsed4.count() << " s\n";
  116. printf("------------\n");
  117.  
  118. //**********************************************************
  119.  
  120. char* str5 = (char*)malloc(sizeof(char) * len_spaces);
  121. memset(str5, ' ', len_spaces);
  122. str5[len_spaces - 1] = '\0';
  123. for (size_t i = 0; i < len_chars; i++) {
  124. str5[i] = 'A' + rand() % ('Z' - 'A');
  125. }
  126. printf("%i\n", strlen(str5));
  127. auto start5 = std::chrono::high_resolution_clock::now();
  128. TrimRight3(str5);
  129. auto finish5 = std::chrono::high_resolution_clock::now();
  130. std::chrono::duration<double> elapsed5 = finish5 - start5;
  131. printf("%i\n", strlen(str5));
  132. std::cout << "Elapsed time: " << elapsed5.count() << " s\n";
  133. printf("------------\n");
  134.  
  135.  
  136.  
  137.  
  138. }
Success #stdin #stdout 0.03s 33044KB
stdin
Standard input is empty
stdout
9999999
1000
Elapsed time: 0.00459637 s
------------
9999999
1000
Elapsed time: 0.00312788 s
------------
9999999
1000
Elapsed time: 0.00869825 s
------------