string_reverser
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/* Returns address of first char in token by seeking backwards */
char *get_reverse_token(char *str, char *firstSentenceChar,
int *tokenCharCount) {
char *token = 0;
(*tokenCharCount) = 0;
while (((str) != firstSentenceChar)
&& (*(str - 1)) != ' ') {
--str;
++(*tokenCharCount);
}
if (str == firstSentenceChar) {
++(*tokenCharCount);
} else if ((*(str - 1)) == ' ') {
++(*tokenCharCount);
}
token = str;
return token;
}
/* Returns the count of delimiters to the next token */
int delimiters_to_next_token(char *str, char *firstSentenceChar) {
char *currTokenChar = str;
if (((*(currTokenChar)) != ' ')
&& ((*(currTokenChar - 1)) == ' ')) {
--currTokenChar;
}
int delimiterCount = 0;
while (((currTokenChar) != firstSentenceChar)
&& (*(currTokenChar)) == ' ') {
--currTokenChar;
++delimiterCount;
}
return delimiterCount;
}
/* Writes a token to a string */
void write_to_sentence(char *writePtr, char *token, int tokenChars,
int delimiterCount) {
int i = 0;
for (i = 0; i < tokenChars; ++i) {
(*writePtr) = token[i];
++writePtr;
}
for (i = 0; i < delimiterCount; ++i) {
(*writePtr) = ' ';
++writePtr;
}
}
/* Duplicates a string */
char *duplicate_string(char *str) {
char *currChar = str;
int charCount = 0;
while ((*currChar) != '\0') {
++currChar;
++charCount;
}
char *newString = (char *)malloc(sizeof(char) * charCount);
int i = 0;
for (i = 0; i < charCount; ++i) {
newString[i] = str[i];
}
return newString;
}
/* Reverses the order of tokens in a string as delimited by whitespace */
void reverse_string(char *sentence) {
char *sentenceCopy = duplicate_string(sentence);
char *writeStringPtr = sentence;
/* Get pointer to end of string */
char *lastSentenceChar = 0;
char *firstSentenceChar = 0;
char *sentenceIter = sentenceCopy;
while (*(sentenceIter + 1) != '\0') {
++sentenceIter;
}
lastSentenceChar = sentenceIter;
firstSentenceChar = sentenceCopy;
char *currTokenChar = lastSentenceChar;
while (currTokenChar != firstSentenceChar) {
/* Get the next token by seeking backwards */
int currTokenCharCount = 0;
char *currToken = get_reverse_token(currTokenChar, firstSentenceChar,
&currTokenCharCount);
currTokenChar = currToken;
/* Seek past delimiters */
int delimiterCount =
delimiters_to_next_token(currTokenChar, firstSentenceChar);
if (delimiterCount != 0) {
currTokenChar -= delimiterCount + 1;
}
/* Write token with delimiters to string */
write_to_sentence(writeStringPtr, currToken, currTokenCharCount,
delimiterCount);
writeStringPtr += (currTokenCharCount + delimiterCount);
}
}
int main() {
char sentence[] = "Now is the winter of our discontent made glorious summer by this son of York";
printf("%s\n", sentence);
reverse_string(sentence);
printf("%s\n", sentence);
return 0;
}