Я хочу заменить все специальные символы в строке своими экранированными эквивалентами (\n \t \\ \"
). Моя идея - использовать читателя и писателя, а затем поставить \\
перед любым специальным символом. Я использую динамический указатель массива/char.Экранирование символов в C
Поскольку я не настолько уверен в понимании указателей, я по-прежнему склонен чаще использовать массивы, чем указатели.
Как обычно, с C я получаю в основном (только) мусор в качестве выхода. Откуда мне это неопределенное поведение? Мой код:
char *escapeChars(const char *src)
{
int i, counter = 0, j = 0;
size_t size = strlen(src) + 1;
char pr[size], *pw;
pr[0] = '\0';
strcat(pr, src); /*to get the constness away*/
pw = pr;
for(i = 0; i < ((int) sizeof(pr)); i++){
if(pr[i] == '\n' || pr[i] == '\t' || pr[i] == '\\' || pr[i] == '\"'){
counter++;
}
}
pw = malloc(sizeof(pr) + (size_t) counter);
for(i = 0; i <((int) sizeof(pr)); i++){
if(pr[i] != '\n' || pr[i] != '\t' || pr[i] != '\\' || pr[i] != '\"'){
pw[i+j] = pr[i];
} else {
pw[i+j] = '\\';
pw[i+j+1] = pr[i];
j++;
}
}
pw[i + j] = '\0';
return pw;
}
В качестве результата я получаю совершенно неправильный материал. И я считаю, что это терпит неудачу, когда встречается с первым специальным символом.
Original string: Some
string with "special characters". And \.
Result: Some
str
Если что-то даже немного неясно, сообщите мне об этом.
С одной стороны, выражение if ... not equals on line 18 будет проблематичным. Он всегда будет возвращать true. –
Да, '||'? – user8
Не могли бы вы показать, как именно вызывается 'escapeChars'? – kaylum