jamesjlinden
11/2/2014 - 11:06 PM

string_reverser

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;
}