/* 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); }