diff options
author | zlg <zlg@zlg.space> | 2012-08-13 20:48:28 -0400 |
---|---|---|
committer | zlg <zlg@zlg.space> | 2012-08-13 20:48:28 -0400 |
commit | aae752e89faa70eea13ebfe00da3a2aed735aec3 (patch) | |
tree | 856768a238f024d7e896a1055c49afcfe3cd878e | |
parent | Solve exercise 1.18 (diff) | |
download | knr-aae752e89faa70eea13ebfe00da3a2aed735aec3.tar.gz knr-aae752e89faa70eea13ebfe00da3a2aed735aec3.tar.bz2 knr-aae752e89faa70eea13ebfe00da3a2aed735aec3.tar.xz knr-aae752e89faa70eea13ebfe00da3a2aed735aec3.zip |
Solve exercise 1.19: Reverse each line of input
-rw-r--r-- | 1-19_reverse-lines.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/1-19_reverse-lines.c b/1-19_reverse-lines.c new file mode 100644 index 0000000..d87b625 --- /dev/null +++ b/1-19_reverse-lines.c @@ -0,0 +1,54 @@ +#include <stdio.h> + +#define MAXLINELENGTH 9001 + +int get_line(char s[], int limit) { + int c, i; + + for (i = 0; i < limit && (c = getchar()) != EOF && c != '\n'; ++i) { + s[i] = c; + } + + s[i] = '\0'; + + /* If I don't include this check, I can't handle blank lines */ + if (c == EOF && i == 0) { + return -1; + } else { + return i; + } + +} + +/* Directly reverse a line's contents. */ +void reverse(char input[], int size) { + int tmp; + int i = 0; + size--; + + /* If len and i are the same, then there's no reason to proceed */ + while (size > i) { + // Store the first character in a temporary spot... + tmp = input[i]; + + // ... and swap! + input[i] = input[size]; + input[size] = tmp; + + // Bring our numbers closer together + ++i; + --size; + } +} + +int main(void) { + // An int and a string to store each line's data in + int line_len; + char buffer[MAXLINELENGTH]; + + while ((line_len = get_line(buffer, MAXLINELENGTH)) != -1) { + reverse(buffer, line_len); + printf("%s\n", buffer); + } + return 0; +} |