示例#1
0
/* A method which reverses the order of the words found in a string. White space, as well,
   is found in reverse order from the original string*/
void reverse_words(char* string) {
    int stringLen = strlen(string);

    //first reverse full string to get correct reverse word order
    reverse_range_in_place(string, 0, stringLen - 1);

    int i;
    int wordStartIdx;
    int wordEndIdx; //unnecessary
    bool isWord = false;

    for (i = 0; i < stringLen; i++) {
        if (string[i] != ' ') {
            if (!isWord) {
                wordStartIdx = i;
                isWord = true;
            }
        } else {
            if (isWord) {
                reverse_range_in_place(string, wordStartIdx, i - 1);
                isWord = false;
            }
        }
    }

    //if there are no trailing spaces, must reverse final word
    if (isWord) {
        reverse_range_in_place(string, wordStartIdx, stringLen - 1);
    }
}
void test_reverse_range_in_place() {
  char* original_string = "Reverse my insides!";
  char test_string[MAX_TEST_STRING_LENGTH];
  strncpy(test_string, original_string, MAX_TEST_STRING_LENGTH);

  reverse_range_in_place(test_string, 9, 5);
  assert(strncmp(original_string, test_string, MAX_TEST_STRING_LENGTH) == 0);

  reverse_range_in_place(test_string, 100, strlen(original_string) - 1);
  assert(strncmp(original_string, test_string, MAX_TEST_STRING_LENGTH) == 0);

  reverse_range_in_place(test_string, 90, -100);
  assert(strncmp(original_string, test_string, MAX_TEST_STRING_LENGTH) == 0);

  reverse_range_in_place(test_string, -9, -5);
  assert(strncmp(original_string, test_string, MAX_TEST_STRING_LENGTH) == 0);

  reverse_range_in_place(test_string, 2, 8);
  assert(strncmp("Rem esrevy insides!", test_string, MAX_TEST_STRING_LENGTH) == 0);

  reverse_range_in_place(test_string, -10, 4);
  assert(strncmp("e meRsrevy insides!", test_string, MAX_TEST_STRING_LENGTH) == 0);

  reverse_range_in_place(test_string, 9, 100);
  assert(strncmp("e meRsrev!sedisni y", test_string, MAX_TEST_STRING_LENGTH) == 0);

  reverse_range_in_place(test_string, -100, 100);
  assert(strncmp("y insides!versRem e", test_string, MAX_TEST_STRING_LENGTH) == 0);
}