aboutsummaryrefslogtreecommitdiff
path: root/ch1/1-19_reverse-lines.c
blob: 4bb83d9ead0b311e629d4136d5b9d162512b6713 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <stdio.h>

/* The C Programming Language: 2nd Edition
 *
 * Exercise 1-19: Write a function reverse(s) that reverses the character
 * string 's'. Use it to write a program that reverses its input a line at a
 * time.
 *
 * Answer: This is really just as simple as using get_line() and reverse() in
 * tandem. I guess the point of this exercise is to teach the reader how to
 * combine the use of functions to get more complex behavior out of a program.
 *
 * My version includes the size of the string in the argument list instead of
 * duplicating effort that get_line() does, since it already puts the contents
 * into a string and returns the length of the string for me. For strict
 * passing of this exercise, reverse() should really only have one argument
 * and it should count the size of the string before it works with it. But
 * that's prone to issues, such as a string that hasn't been terminated
 * properly.
 */

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