#include #include #include // Reverse the words in a string // This will reverse all characters in the string first // then it will reverse each word so they are not backwards unsigned char get_input(char** buf); void reverse_string(char* buf, size_t size); void reverse_each_word(char* buf); int main(int argc, char** argv){ char* buffer = 0; size_t size = get_input(&buffer); if (!size){ return 0; } printf("%s\n", buffer); reverse_string(buffer, size); reverse_each_word(buffer); printf("%s\n", buffer); // free the memory allocated during getline free(buffer); return 0; } unsigned char get_input(char** buf){ ssize_t read; size_t buf_size = 0; // Read in the line from STDIN read = getline(buf, &buf_size, stdin); if (read < 2){ fprintf(stderr, "Nothing read\n"); return 0; } char* buffer = *buf; if (buffer[read-1] == '\n') { buffer[read-1] = 0; } return read - 1; } // expected input: the cat jumped. // expected output: .depmuj tac eht void reverse_string(char* buf, size_t size){ int b = 0; int e = size - 1; char tmp; while (b < e){ tmp = buf[b]; buf[b] = buf[e]; buf[e] = tmp; b++; e--; } } // expected input: .depmuj tac eht // expected output: jumped. cat the void reverse_each_word(char* buf){ char* iter = buf; char* begin = 0; size_t size = 0; while (*iter){ if (!begin){ begin = iter; } if (isspace(*iter)){ reverse_string(begin, size); size = 0; begin = 0; } else{ size++; } iter++; } reverse_string(begin, size); }