Мда..., эффективность вашего алгоритма ниже плинтуса.
char *escapeString(char *str) {
char *result, *temp;
int i;
temp = malloc(strlen(str)*2+1);
i = 0;
while (*str) {
switch(*str) {
case '\n':
temp[i++] = '\\';
temp[i++] = 'n';
break;
case '\r':
temp[i++] = '\\';
temp[i++] = 'r';
break;
case ':':
case '$':
case '\\':
temp[i++] = '\\';
default:
temp[i++] = *str;
}
str++;
}
temp[i] = 0;
result = malloc(i+1);
strcpy(result, temp);
free(temp);
return result;
}
А причина ошибки у вас простая, s -
символ, а strcat объединяет
строки. Разница в том, что в конце строки
обязан стоять символ '\x00'. Поскольку память резервировалась в стеке, то по адресу (&s) находится символ, а по адресу (&s+1) - начинается переменная i. При i = 1 strcat по адресу &s читает строку "C\x01\x00", при i =2 - "O\x02\x00" и т.д.