Замена управляющих символов обычными и наоборот

K&R (73). Ответ к упражнению 3.2.

Замена управляющих последовательностей обычными символами

#include <stdio.h>
#define MAX 1000
 
void escape (char s[], char s1[]);
 
main () {
	char str[MAX], str1[MAX];
	int i, c;
 
	for (i = 0; (c = getchar()) != EOF; ++i)
		str[i] = c;
 
	escape (str1, str);
	printf("%s\n", str1);	
}
 
void escape (char to[], char from[]) {
	int i, k;
 
	i = k = 0;
	while (from[i] != '\0') {
		switch (from[i]) {
		case '\n':
			to[k++] = '\\';
			to[k++] = 'n';
			break;
		case '\t':
			to[k++] = '\\';
			to[k++] = 't';
			break;
		default:
			to[k++] = from[i];
			break;
		}
		++i;
	}
	to[k] = '\0';
}

Примечание. Используется постфиксная форма инкремента (k++). В этом случае k сначала используется и только потом увеличивается на единицу.
При выводе измененной строки появляются странные "артефакты" в конце.

Замена пар символов "\n" и "\t" управляющими последовательностями

#include <stdio.h>
#define MAX 1000
 
void escape (char s[], char s1[]);
 
main () {
	char str[MAX], str1[MAX];
	int i, c;
 
	for (i = 0; (c = getchar()) != EOF; ++i)
		str[i] = c;
 
	escape (str1, str);
	printf("%s\n", str1);	
}
 
void escape (char to[], char from[]) {
	int i, k;
 
	i = k = 0;
	while (from[i] != '\0') {
		if (from[i] == '\\' && from[i+1] == 'n') {
			to[k++] = '\n';
			i += 2;
		}
		else if (from[i] == '\\' && from[i+1] == 't') {
			to[k++] = '\t';
			i += 2;
		}
		else
			to[k++] = from[i++];
	}
	to[k] = '\0';
}

Создано